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
假设我在文件中定义了一个 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