假设我有一个简单的快速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"}
答案 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)
这两个选项对我有用,没有任何错误:
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");
});
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");
});