我有一个相当简单的express .带有登录组件的js应用,如果登录失败,我想提前退出.我看到有迹象表明,该应用程序没有这样做,我还没有找到一个明确的答案,表明拨打res.send()是否会停止任何进一步的处理.以下是我目前的代码:

client.login( username, password, function( auth, client ) {
  if( !auth ) {
    res.send( 401 );
  }

  // DO OTHER STUFF IF AUTH IS SUCCESSFUL
}

如果我正确地阅读了源代码,它将终止请求(中止进一步的处理),但我是node的新手,所以我还没有完全准备好相信我所阅读的内容.简而言之,我想我主要是从一个更可靠的源代码中寻找一个明确的答案,而不是我自己对不熟悉的源代码的解释.如果send()不中止处理,正确的方法是什么?

推荐答案

如果使用express作为框架,则应该调用next().

express中的每个处理程序接收3个参数(基本http的Unlink 2),分别为reqresnext

next是一个在没有参数的情况下调用的函数,它将触发中间件链中的下一个处理程序.

如果使用参数调用next,则无论该参数的类型如何,该参数都将被解释为错误.

它的签名是next([error]).当用错误调用next时,它会调用错误处理程序,而不是调用中间件链中的下一个处理程序.您应该在该错误处理程序中处理401响应代码.有关Express中错误处理的更多信息,请参见this

编辑:正如@Baptiste Costa所 comments 的,简单地调用next()将停止当前的执行,但它将调用下一个中间件.最好使用return next()来防止 node 进一步抛出错误(例如can't set headers after they are sent错误).这包括上述常见的错误抛出建议:

return next(new Error([error]));

Node.js相关问答推荐

Spotify Auth访问令牌给出错误代码400

赫斯基添加命令已弃用?

错误:找不到模块';/var/apps/前端/bash';

使用参考中断Mongoose模型-Node.js

将 POST 的 json 变量格式化为 lambda

合并Shift对象数组以创建最终的排班表

如何在 Docker 容器中 SSO 登录 AWS(使用 aws-sdk v3)

为什么后端开发需要单独的服务器?

npm install 在 Mac 上的 Node-gyp 构建错误

为什么 $or 在带有正则表达式的mongoose 中不能正常工作

在mongodb中只查询整数

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

为什么在调用数据库调用时我的参数没有定义?

Node.js mongodb 驱动程序异步/等待查询

如何在 NodeJS 中获取操作系统用户名?

如何从 Redis 保存和检索会话

什么是 JavaScript 中的REPL?

NodeJS 中的 HTTPS 请求

从 node.js 连接到 mongodb 时出现 ECONNREFUSED 错误

在 Node.js 上使用 Connect 无法获取 /