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