Express.js -为所有已定义的路由添加子路由



假设我在文件中定义了一个Express应用,如server.js:

const app = express();
app.use('/foo', foo);
app.use('/bar', bar);
module.exports = app;

我将这个Express应用程序导入到另一个文件中,输入index.js:

const app = require('./server');
const port = process.env.PORT || 3000;
const listen = (port) => {
app.listen(port, () => {
console.log(`Backend listening on port ${port}!`);
});
};
listen(port);

现在,这个应用程序可用的路由是/foo/bar

是否有办法在index.js文件中编辑配置,使路由成为/api/foo/api/bar?不碰server.js文件

<标题>

用例:我有一个Nuxt.js应用程序的后端是加载到Nuxt应用程序通过serverMiddleware属性在nuxt.config.js像这样:

serverMiddleware: [
...
{ path: '/api', handler: '~/server.js' },
],

它的效果类似于我上面描述的:它从server.js应用中导入express应用,并在它所有的路由前加上/api

然而,通常我不想开发Nuxt应用程序的前端部分,我只想在后端做更改。为此,我有一个像上面的index.js这样的助手文件,它只运行后端。(前端通常需要很长时间来编译,这就是为什么我不想在不需要的时候编译它。)

这就产生了一个问题,所有的路由都略有不同——它们在开始时缺少/api。这些路线被用在不同的工具上,比如邮差等,突然它们就不能工作了。

我目前的解决方案是以与server.js文件相同的方式定义index.js文件,所有路由都像我想要的那样定义-而不是app.use('/foo', foo);,有app.use('/api/foo', foo);等,但这有它自己的问题,例如,如果我改变server.js,我必须改变index.js。我想找一件更优雅的。

根据express 4.0文档https://expressjs.com/en/4x/api.html#app.use,您可以像使用router一样使用application实例。简而言之,只需在您想要插入它的路由上使用server.js的导出作为中间件,而不是直接在其上调用.listen()

下面是一些为我工作的演示代码:

const express = require('express');
const app_inner = express();
app_inner.use('/foo', (req,res) => res.send('foo'));
const app_outer = express();
app_outer.use('/foo2', app_inner);
app_outer.listen(9999);
// web browser at localhost:9999/foo2/foo returns 'foo' as expected

相关内容

  • 没有找到相关文章

最新更新