Express.js - 将子路由添加到所有定义的路由

Express.js - prepend sub-route to all defined routes

假设我在文件中定义了一个 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.config.js 中的 serverMiddleware 属性 加载到 Nuxt 应用程序中,如下所示:

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

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

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

这会产生一个问题,即所有路线都略有不同 - 它们缺少开头的 /api。这些路由正在不同的工具中使用,如 Postman 等。突然它们不起作用。

我目前的解决方案是以与 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