繁体   English   中英

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通过应用serverMiddleware物业nuxt.config.js这样的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM