当前位置: 首页 > 面试题库 >

在Express.js中的res.send()之后退出

孔俊爽
2023-03-14
问题内容

我有一个相当简单的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()。

在表达每个处理程序接收3个参数(unlinke 2为基本HTTP),其是reqresnext

next 是一个不带任何参数的函数,它将触发中间件链中的下一个处理程序。

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

其签名为next([error])。当next被错误调用时,它而不是调用中间件链中的next处理程序,而是调用错误处理程序。您应该在该错误处理程序中处理401响应代码。请参阅此以获取有关Express中错误处理的更多信息。

编辑:作为 @Baptiste科斯塔 评论,只是要求next()不会
停止当前的执行,但它会调用上的下一个中间件。较好的做法是使用它return next()来防止Node进一步抛出错误(例如can't set headers after they are sent-错误)。这包括以上常见的错误抛出建议:

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


 类似资料:
  • 问题内容: 两者之间的实际区别是什么,并且两者似乎都执行相同的响应客户端的操作。 问题答案: 传递对象或数组时,方法是相同的,但也会转换非对象,例如和,它们是无效的JSON。 该方法还使用和应用程序设置,因此您可以使用更多选项来格式化JSON。这些选项设置如下: 并传递给一个这样的: 这是send方法没有的方法中的代码: 该方法最终以a 结尾:

  • 和之间的实际区别是什么,因为两者似乎都执行相同的响应客户端的操作。

  • 问题内容: 我想知道以下代码的行为背后的机制是什么: 我的理解是不 返回 函数,而是 关闭连接/结束请求 。这可以解释为什么我仍然可以在命令后执行代码(我查看了快速源,但它似乎不是异步函数)。 还有其他我可能会想念的东西吗? 问题答案: 当然可以结束HTTP响应,但是它对您的代码没有做任何特殊的事情。 即使您已结束回复,也可以继续做其他事情。 但是,您 无法 做的是利用进行任何有用的操作。由于响应

  • NodeJS/Express:什么是“app.use”?我读了这篇文章,仍然对这个程序中的控制流感到困惑。为什么如果我访问“localhost:3000/add product”,记录的结果是“这总是运行!在add product中间件中!这总是运行!在另一个中间件中!”(我省略了变更行)这是否意味着在它进入第二个应用程序之后。如我所知,使用每个应用程序。每次向服务器发送请求时都会调用use(中间

  • 问题内容: 我是表示和node.js的新手,我不知道app.use和app.get之间的区别。似乎您可以同时使用它们来发送信息。例如: 似乎与此相同: 问题答案: 用于将中间件绑定到您的应用程序。它是一个“ 安装 ”或“ 前缀 ”路径,并限制中间件仅适用于以它 开头的 任何请求的路径。它甚至可以用于嵌入另一个应用程序: 通过指定为“ mount ”路径,将响应以开头的所有路径,并且所有路径均与使用

  • 问题内容: Node.js有点新,所以我几乎无法在Internet上找到东西。我已经解决了。这是因为我是使用来从客户端呼叫的。但是,当我在下面的代码中尝试使用它时,它永远不会呈现。初始页面是/ contact,当我调用/ contact / sendEmail时,/ contact / sendEmail中的所有功能都可以使用,但渲染时不起作用。完全没有错误。就像什么都没有发生。 它被这个函数调用