Javascript 从节点内部内部调用快速路由
我的API有一个ExpressJS路由,我想在NodeJS中调用它Javascript 从节点内部内部调用快速路由,javascript,node.js,http,express,routing,Javascript,Node.js,Http,Express,Routing,我的API有一个ExpressJS路由,我想在NodeJS中调用它 var api = require('./routes/api') app.use('/api', api); 在我的/routes/api.js文件中 var express = require('express'); var router = express.Router(); router.use('/update', require('./update')); module.exports = router; 因
var api = require('./routes/api')
app.use('/api', api);
在我的/routes/api.js文件中
var express = require('express');
var router = express.Router();
router.use('/update', require('./update'));
module.exports = router;
因此,如果我想从前端调用/api/update/something/:withParam
,那么我需要从NodeJS脚本的另一个方面调用它,而无需在第二个位置重新定义整个函数
我已经尝试从内部使用HTTP模块,但我只是得到了一个“ECONNREFUSED”错误
我理解Express背后的想法是创建路由,但我如何在内部称它们为处理这一问题的“常规”或“正确”方法是让您想要调用的函数自行中断,与任何路由定义分离。也许在它自己的模块中,但不一定。那就在你需要的地方打电话吧。像这样:
function updateSomething(thing) {
return myDb.save(thing);
}
// elsewhere:
router.put('/api/update/something/:withParam', function(req, res) {
updateSomething(req.params.withParam)
.then(function() { res.send(200, 'ok'); });
});
// another place:
function someOtherFunction() {
// other code...
updateSomething(...);
// ..
}
这是在Express 4中执行内部重定向的一种简单方法: magic可以做的功能是:app.\u router.handle() 测试:我们向主页“/”发出请求,并将其重定向到其他路径“/other/path”
我已经为此制作了一个专用中间件: 在
req
中可用,它允许您req.uest
另一条路由(来自给定路由)
它将原始cookie转发给后续请求,并在请求之间保持req.session
同步,例如:
app.post('/login', async (req, res, next) => {
const {username, password} = req.body
const {body: session} = await req.uest({
method: 'POST',
url: '/api/sessions',
body: {username, password}
}).catch(next)
console.log(`Welcome back ${session.user.firstname}!`
res.redirect('/profile')
})
它支持承诺、等待和错误优先回调
有关更多详细信息,请参见为什么要那样攻击服务器?为什么你不愿意只在那里做同样的操作呢?因为我不想重复@ian的一个可能重复的函数这是在那个问题5天前被问到的:)是的,在做了更多的挖掘之后,我意识到这可能是唯一的方法。我不确定Express是否有内置的“呼叫您自己的路线”功能。ThanksI get
TypeError:无法读取未定义的属性“句柄”
var app = express()
function otherPath(req, res, next) {
return res.send('ok')
}
function home(req, res, next) {
req.url = '/other/path'
/* Uncomment the next line if you want to change the method */
// req.method = 'POST'
return app._router.handle(req, res, next)
}
app.get('/other/path', otherPath)
app.get('/', home)
app.post('/login', async (req, res, next) => {
const {username, password} = req.body
const {body: session} = await req.uest({
method: 'POST',
url: '/api/sessions',
body: {username, password}
}).catch(next)
console.log(`Welcome back ${session.user.firstname}!`
res.redirect('/profile')
})