【问题标题】:How can I trigger a route handler manually in express js?如何在 express js 中手动触发路由处理程序?
【发布时间】:2015-05-12 03:27:29
【问题描述】:

假设我有一个简单的 express js 应用程序,如下所示:

var express = require('express');
var app = express();

app.get('/', function(req, res) {
  return res.json({ hello: 'world' });
});

module.exports = app;

我希望能够进入命令行,请求应用程序,启动服务器并模拟请求。像这样的:

var app = require('./app');
app.listen(3000);
app.dispatch('/') // => {hello:"world"}

【问题讨论】:

  • 您可以使用http 模块发出请求。
  • 我更想知道 express 内部是如何处理这个问题的,我一直在搜索源代码,但老实说我找不到。
  • Express 并没有这样的东西,因为您必须模拟有关请求和响应的所有内容。

标签: node.js express run-middleware


【解决方案1】:

此解决方案使用 express 4.16 完美运行 (以及可选的 -express promise router ,这是一个很好的错误处理包装器)

它很简单,无需在路由器内部使用路由器,也无需像其他建议的答案那样重写请求

只需更改请求中的 URL 并将其返回给路由器句柄函数

const router = require('express-promise-router')();

router.post('/signin', function(req, res , next) {

    if (req.body.Username === 'admin') {
        req.url = '/admin/signin'   
        router.handle(req, res, next)
    }
    else  {  // default doctor
        req.url = '/doctors/signin'
        router.handle(req, res, next)
    }

});

router.post('/doctors/signin',someCallback1)
router.post('/admin/signin',someCallback1)

【讨论】:

    【解决方案2】:

    这两个选项对我有用,没有任何错误:

    选项 1

    app.post('/one/route', (req, res, next) => {
      req.url = '/another/route'
      req.method = 'GET'
      next();
    });
    
    app.get('/another/route', (req, res) => {
      console.log("Hi, I am another route");
    });
    

    选项 2

    app.post('/one/route', (req, res, next) => {
      req.url = '/another/route'
      req.method = 'GET'
      app._router.handle(req, res, next);
    });
    
    app.get('/another/route', (req, res) => {
      console.log("Hi, I am another route");
    });
    
    • 快递:4.15.4
    • 不需要额外的库或 npm 模块

    【讨论】:

      【解决方案3】:

      您完全可以使用run-middleware 模块。这是通过创建新的请求和响应对象来工作的,并使用这些对象调用您的应用程序。

      app.runMiddleware('/yourNewRoutePath',{query:{param1:'value'}},function(responseCode,body,headers){
           // Your code here
      })
      

      更多信息:

      披露:我是这个模块的维护者和第一个开发者。

      【讨论】:

        【解决方案4】:

        据我所知,没有办法在内部切换到特定路线,但有办法标记请求,然后转到下一条路线:

        app.use((req, res, next) => {
            if("nextRouteCondition"){
                req.skip = true;
                return next();
            }
        })
        

        这可以让你完成你想做的事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-13
          • 2018-06-18
          • 2021-07-26
          • 1970-01-01
          • 1970-01-01
          • 2019-02-27
          • 2017-03-07
          • 2017-06-07
          相关资源
          最近更新 更多