首页 > 解决方案 > 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/fooand /api/bar?无需触摸server.js文件。

用例:

我有一个Nuxt.js带有后端的应用程序,它Nuxt通过如下serverMiddleware属性加载到应用程序中nuxt.config.js

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

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

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

这会产生一个问题,即所有路线都略有不同——它们/api一开始就没有。这些路线被用于 Postman 等不同的工具中,但突然间它们就不起作用了。

我目前的解决方案是以与index.jsfile 相同的方式定义文件,其中server.js定义了我想要的所有路由 - 而不是等等,但这有其自身的问题,例如,如果我改变app.use('/foo', foo);我必须改变. 我正在寻找更优雅的东西。app.use('/api/foo', foo);server.jsindex.js

标签: javascriptnode.jsexpressnuxt.js

解决方案


根据 express 4.0 文档https://expressjs.com/en/4x/api.html#app.use,您可以application像使用router. 简而言之,只需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

推荐阅读