如何在路由器中正确使用Express中间件功能?
How to use Express middleware functions correctly in router?
在下面的示例中,您可以看到 csrfProtection 和 parseForm 函数在 GET 中作为 parameters/callbacks 传递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')
})
但是,如果你像我一样使用路由器,如何使用这些相同的功能?我知道通过 "using" 它们在 app.js 中,它们在 req
对象上可用,但在上面给出的示例中,它们需要作为GET 和 POST 路由,但是 req
在您进入最终回调之前不可用?!
所以我知道您不能执行以下操作(仅作为示例)...那么您应该如何使用它们?我是否必须在每个路由文件中重新声明它们?
单独的路由文件:routes/someroute.js
...
router
.post('/', req.body, req.csrfProtection, (req, res) => {
})
...
提前致谢:)
参考:https://www.npmjs.com/package/csurf
更新
根据下面的评论,我对 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]
我想你问的是在所有 API/routes 个文件之间共享中间件
你可以这样做:
首先在您的主文件中调用它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;
希望对您有所帮助。
部分链接:
在下面的示例中,您可以看到 csrfProtection 和 parseForm 函数在 GET 中作为 parameters/callbacks 传递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')
})
但是,如果你像我一样使用路由器,如何使用这些相同的功能?我知道通过 "using" 它们在 app.js 中,它们在 req
对象上可用,但在上面给出的示例中,它们需要作为GET 和 POST 路由,但是 req
在您进入最终回调之前不可用?!
所以我知道您不能执行以下操作(仅作为示例)...那么您应该如何使用它们?我是否必须在每个路由文件中重新声明它们?
单独的路由文件:routes/someroute.js ...
router
.post('/', req.body, req.csrfProtection, (req, res) => {
})
...
提前致谢:)
参考:https://www.npmjs.com/package/csurf
更新
根据下面的评论,我对 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]
我想你问的是在所有 API/routes 个文件之间共享中间件
你可以这样做:
首先在您的主文件中调用它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;
希望对您有所帮助。
部分链接: