【问题标题】:Run a route by code in expressjs在 expressjs 中通过代码运行路由
【发布时间】:2018-03-09 10:30:31
【问题描述】:

正如标题所说。我需要从另一条路线调用一条路线。

我使用了 run-middleware npm 模块,但在使用之后 Morgan 显示奇怪的输出,比如显示两个 http 请求,但两者都是相同的。还访问无效路线不会捕获所有路线。相反,它的抛出错误。这是一个日志。

data:    app/server.js:29146 - ======================================
data:    app/server.js:29146 - 200
data:    app/server.js:29146 - <!DOCTYPE html>
data:    app/server.js:29146 - <html lang="en">
data:    app/server.js:29146 - <head>
data:    app/server.js:29146 - <meta charset="utf-8">
data:    app/server.js:29146 - <title>Error</title>
data:    app/server.js:29146 - </head>
data:    app/server.js:29146 - <body>
data:    app/server.js:29146 - <pre>Cannot POST /api/v1/auth/authenticate</pre>
data:    app/server.js:29146 - </body>
data:    app/server.js:29146 - </html>
data:    app/server.js:29146 - ======================================
data:    app/server.js:29146 - POST /api/v1/auth/authenticate - - ms - -
data:    app/server.js:29146 - POST /api/v1/auth/authenticate 200 474.491 ms - 268

我在 /asd 路由无效的地方使用了以下代码

req.runMiddleware('/asd',{method:'post'},function(code,data){
    console.log('======================================');
    console.log(code);
    console.log(data);
    console.log('======================================');
});

有没有其他图书馆可以用于此目的?

或者任何人都可以帮助我创建自己的? 我知道如何制作中间件以及如何调用express的中间件链,我只想知道req对象的哪些字段需要更改和恢复。

【问题讨论】:

  • 您已经构建了自己的中间件,对吧?
  • 是的,我有几个,但我从未修改过 req 或 res

标签: node.js express run-middleware


【解决方案1】:

我无法准确说出您在问什么,因为您没有在尝试调用另一条路线的位置显示代码。

如果你在一个路由处理程序中,并且你想调用另一个路由处理程序的逻辑,有几种选择:

  1. 将公共代码提取到两个路由处理程序都可以执行的函数中。因此,您可以从任一路由处理程序调用公共代码。出于某种原因,人们似乎忘记了路由处理程序可以像所有其他 Javascript 函数一样被纳入共享代码。

  2. 返回一个 302 重定向来告诉调用者重定向到另一个路由。然后它将请求其他路由和路由处理程序可以处理。

  3. 向您自己的服务器发出 http 请求以获取其他路由的结果,然后在此路由中使用该结果。

通常选项 1 是最好的方法,因为它涉及的开销最少。

您真的不想走自己的 reqres 对象,您可以欺骗 express 为您做某事。只需完全排除等式并将共享代码分解为独立于reqres 的单独函数即可。将所需的输入传递给共享函数并返回结果,然后让每个路由分别处理自己的reqres。或者,如果您希望它们在 reqres 上进行相同的操作,您可以将它们直接传递到共享函数并让它直接对它们进行操作。

【讨论】:

  • 目前我有返回承诺的控制器,它们独立于 req 和 res。但是现在有一个问题,控制器内部有很多 .then ,有时我需要跳过一些 .then 在一个 & 还返回值给控制器的调用者.. 你知道如何跳过 .then 除了抛出有错误吗?
  • @JayadrathaMondal - 我们真的无法很好地帮助您解决这些理论问题。向我们展示实际代码(在您的问题中),我很确定我们可以提供非常具体和有用的建议。这听起来也与您第一次发布的问题不同(因为它是关于控制器的,所以也许您应该在新问题中发布它(带有适当的代码段)。如果您在此处发表评论并带有指向新问题的链接,我来看看新问题。
  • 是的,最后一条评论与问题无关。如果我完全不遵循您的选项 1,我将提出一个新问题。
猜你喜欢
  • 2015-12-24
  • 2018-07-29
  • 2017-05-15
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多