【问题标题】:How to use Express middleware functions correctly in router?如何在路由器中正确使用 Express 中间件功能?
【发布时间】:2019-02-28 09:31:42
【问题描述】:

在下面的示例中,您可以看到 csrfProtectionparseForm 函数在 GET 和 POST 请求中作为参数/回调传递...

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')

// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })

// create express app
var app = express()

// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())

app.get('/form', csrfProtection, function(req, res) { // HERE 
  // pass the csrfToken to the view
  res.render('send', { csrfToken: req.csrfToken() })
})

app.post('/process', parseForm, csrfProtection, function(req, res) { // AND HERE
  res.send('data is being processed')
})

但是,如果您像我一样使用路由器,如何使用这些相同的功能?我知道通过在 app.js 中“使用”它们,它们可以在 req 对象上使用,但在上面给出的示例中,它们需要作为 GET 和 POST 路由的第二、第二和第三个参数,但是req 在您进入最终回调之前不可用?!

所以我知道您不能执行以下操作(仅作为示例)...那么您应该如何使用它们?我是否必须在每个路由文件中重新声明它们?

单独的路由文件:routes/someroute.js ...

router
    .post('/', req.body, req.csrfProtection, (req, res) => {

    })

...

提前致谢:)

参考:https://www.npmjs.com/package/csurf

更新

按照下面的 cmets,我对我的 app.js 文件进行了以下更改。

app.js

...

global.bodyParser = require('body-parser').urlencoded({extended: false});
app.use(global.bodyParser);

global.csrfProtection = csrf({ cookie: false });

...

routes/myroute.js

router
    .post('/', global.bodyParser, global.csrfProtection, (req, res) => {})

但是,当我重新启动服务器时,我看到了这个错误,这表明未定义全局函数......我在这里错过了什么? :-/

Error: Route.post() requires a callback function but got a [object Undefined]

【问题讨论】:

  • 我不确定问题。但是,如果您想在其他路由器文件中重用功能。像 userRoutes.js、authRoutes.js 等。为什么不让它们全局化?并在任何地方使用它们。像这样在 server 或 app.js 中你的情况 global.csrfProtection = csrf({ cookie: true }) 然后在任何文件中你可以使用它们。 nodejs.org/api/globals.htmlstackabuse.com/using-global-variables-in-node-js
  • 它们是在您的整个 Express 应用程序中本地还是在您正在创建的路由器中?
  • 我考虑了全局方法,但不确定这是否是正确的方法。 @MinusFour 在处理 POST 请求的多个不同路径中将需要它们。
  • 关于你的方法,我认为它是错误的。如果您可以在所有路由之前简单地附加中间件,为什么要尝试处理所有 POST/PUT/DELETE 路由并在那里添加中间件,它适用于所有人。像这样 。 app.use(bodyParser.urlencoded({ extended: false }))。而已。只需将它包含在初始化脚本中的所有路由之前。
  • 无论如何我都会附上答案。在删除之前检查一下。

标签: javascript node.js express csrf


【解决方案1】:

我想你问的是跨所有 API/路由文件共享中间件

你可以这样做:

首先在你的主文件中调用它server.js我们使用你的代码

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')

// create express app
var app = express()

// setup route middlewares
app.use(bodyParser.urlencoded({ extended: false }))

// parse cookies
app.use(cookieParser())
//enable your JS API/route script.
const awesomeAPI = require('./awesomeApi.js');
app.use('/awesome', awesomeAPI );
app.listen(3000);

现在你有了文件,我们称之为awesomeApi.js

const express = require('express');
const awesomeApi = express.Router();
awesomeApi.route('/')
   .post(req,res => {
  //req.body present here. And body parser middle ware works.
})
module.exports = awesomeApi;

希望这会有所帮助。

一些链接:

https://expressjs.com/en/guide/using-middleware.html

https://expressjs.com/en/4x/api.html#express

【讨论】:

  • 是的,你是对的!我是个笨蛋!感谢您的澄清;)
  • Np。很高兴能提供帮助。
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多