如何在快速js中手动触发路由处理程序?

时间:2015-03-10 15:43:51

标签: node.js express run-middleware

假设我有一个简单的快速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"}

4 个答案:

答案 0 :(得分:6)

您可以完全使用run-middleware模块。这是通过创建新的Request& amp;响应对象,并使用这些对象调用您的应用程序。

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

更多信息:

披露:我是维护者&该模块的第一个开发人员。

答案 1 :(得分:2)

此解决方案通过使用Express 4.16可以完美地工作 (以及可选的-express promise router ,这是处理错误的好方法)

它的strait-foreword,不像在其他建议的答案中那样,不使用路由器内部的路由器,也不重写请求。

只需更改请求中的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 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

选项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模块