我在跟踪node.js快速应用程序时遇到了一个问题.以下是样品 人们经常使用:

app.get('/api/users', function(req, res) {
    const user_id = req.query.id;
    const token = req.query.token;
    const geo = req.query.geo;

    res.send({
        'user_id': user_id,
        'token': token,
        'geo': geo
    });
}); 

然而,在csurf的情况下,身份验证函数如下:

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

问题是,像GET或POST这样的Express应用程序函数参数的定义是什么, 它似乎与通常的使用场景非常不同,如上面的第一种情况, 而express 的办公文件也没有解释四参数的情况. 我们非常感谢您的指导,非常感谢.

推荐答案

parseFormcsrfProtectionfunction(req,res)都是请求处理程序/中间件,您可以拥有所需的任意数量(最少1个),作为参数一个接一个地传递给app.get()app.post()或任何app.xxx()谓词.

他们一个接一个地被召唤,当前一个呼叫next()时,他们前进到下一个.他们都被传递了(req, res, next)个参数.这就是中间件链的工作方式.

因此,在这个特定的处理程序中:

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

它将首先呼叫parseForm(req, res, next),当/如果呼叫next(),它将接着呼叫csrfProtection(req, res, next),当/如果呼叫next()时,它将接着呼叫您function(req, res).仅供参考,Next实际上也传递给了它,如果您不打算使用它,则不必声明它.

无论其中哪一个想要结束响应,都会发送一个类似于res.send()的响应,然后不调用next(),响应将完成,链将结束.这可以从链中的任何位置完成.


您将在Express doc中看到它显示:

app.post(path, callback [, callback ...])

该符号表示您可以在路径之后传递一个或多个回调.parseFormcsrfProtectionfunction(req, res)都是与该调用签名匹配的回调.

Node.js相关问答推荐

如何在CustomGPT的 node 中使用服务器端事件(SSE)

Mongoose查询-如何根据当前查找ID获取其他集合并将其插入到当前查找中?

如何使用Nextjs路由从下一步/导航在新选项卡中通过";router.ush";打开链接

获取驱动器文件夹的直接子文件夹时出现问题

谷歌应用程序脚本UrlFetchApp和nodejs-axios返回不同的结果;MyFitnessPal日记

Express Web 服务器部署到 prod 但 GET 返回超时错误

为什么当我使用waitForSelector时 Puppeteer 导致我的测试套件挂起 30 秒,即使我在页面和浏览器上调用关闭?

在 Header 中使用 Authorization 方法和新的附加参数:accessToken 有什么区别?

Typescript typeRoots 未检测到类型定义

多字段传递获取查询失败

try 在 Heroku 中部署 PRN 应用程序并获得 404

Mongoose-更新嵌套数组

如何在 mongoDB 中进行全动态搜索?

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

Nodejs续集批量更新

Fluxible 中的脱水和再水合代表什么?

如何忽略文件 grunt uglify

使用 Monit 而不是基本的 Upstart 设置有什么好处?

为什么 Node.js 被命名为 Node.js?

如何阻止 babel 将this转换为undefined(并插入use strict)