Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在路由器中正确使用Express中间件功能?_Javascript_Node.js_Express_Csrf - Fatal编程技术网

Javascript 如何在路由器中正确使用Express中间件功能?

Javascript 如何在路由器中正确使用Express中间件功能?,javascript,node.js,express,csrf,Javascript,Node.js,Express,Csrf,在下面的示例中,您可以看到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 csrfProtecti

在下面的示例中,您可以看到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

提前感谢:)

参考:

更新

根据下面的评论,我对app.js文件做了以下更改

app.js

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

routes/myroute.js

router
    .post('/', global.bodyParser, global.csrfProtection, (req, res) => {})
但是,当我重新启动服务器时,我看到了这个错误,这表明全局函数没有定义。。。我错过了什么-/

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

我想你会问关于在所有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;
希望这有帮助

一些链接:


我对这个问题没有把握。但是如果您想在其他路由器文件中重用函数。如userRoutes.js、authrouts.js等。。为什么不让它们全球化?并在任何地方使用它们。在服务器或app.js中,在您的案例中是这样的
global.csrfProtection=csrf({cookie:true})
,然后在任何可以使用它们的文件中。它们是您整个express应用程序的本地应用程序还是您正在创建的路由器的本地应用程序?我考虑了全局方法,但不确定这是否是正确的方法@第四,在处理POST请求的多个不同路径中需要它们。关于你的方法,我认为它是错误的。为什么要尝试将所有POST/PUT/DELETE路由都删除,并在那里添加中间件呢?如果您只需在所有路由之前附加中间件,那么它将适用于所有人。像这样
app.use(bodyParser.urlencoded({extended:false}))
。就这样。只需在初始化脚本中的所有路由之前包含它。我还是附加了答案。。删除前请先查看。是的,你说得对!我是一个裸体!感谢您的澄清;)NP很乐意帮忙。
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;