12

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

4 回答 4

10

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

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

更多信息:

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

于 2016-09-14T13:20:32.370 回答
3

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

选项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 模块
于 2019-07-15T02:23:25.227 回答
3

该解决方案通过使用 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)

于 2019-02-11T15:12:30.157 回答
-1

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

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

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

于 2016-07-12T01:05:17.877 回答