【发布时间】:2019-02-28 09:31:42
【问题描述】:
在下面的示例中,您可以看到 csrfProtection 和 parseForm 函数在 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.html 。 stackabuse.com/using-global-variables-in-node-js -
它们是在您的整个 Express 应用程序中本地还是在您正在创建的路由器中?
-
我考虑了全局方法,但不确定这是否是正确的方法。 @MinusFour 在处理 POST 请求的多个不同路径中将需要它们。
-
关于你的方法,我认为它是错误的。如果您可以在所有路由之前简单地附加中间件,为什么要尝试处理所有 POST/PUT/DELETE 路由并在那里添加中间件,它适用于所有人。像这样 。
app.use(bodyParser.urlencoded({ extended: false }))。而已。只需将它包含在初始化脚本中的所有路由之前。 -
无论如何我都会附上答案。在删除之前检查一下。
标签: javascript node.js express csrf