解决方案#1:将 Sapper 应用程序导出为中间件
您可以自己导出 Sapper 应用程序。在 Sapper 应用程序的 server.ts/server.js 中,您可以导出中间件,而不是启动服务器。像这样的事情:
import * as sapper from "@sapper/server";
export const handler = sapper.middleware();
然后在您的 Express 应用程序中只需将域映射到导出的中间件:
const express = require('express');
const vhost = require('vhost');
const path = require('path');
const { handler } = require('./__sapper__/build/server/server');
const app = express();
app.use(vhost('*.example.com', (req, res, next) => {
if (req.vhost[0] === 'sapper') {
return handler(req, res, next);
}
return res.statusCode(400);
}))
app.listen(3000, () => console.log('Server started'));
解决方案#2:使用反向代理
另一种解决方案是在服务器上的不同端口中运行所有嵌套应用程序,并使用反向代理来相应地路由请求。
为了在不同端口上运行嵌套应用程序,可能的解决方案是对它们进行 docker 化或使用pm2 https://pm2.keymetrics.io/.
对于反向代理部分,您可以使用 Nginx 或Traefik https://traefik.io/traefik/。还可以编写一个反向代理中间件来以编程方式处理它http 代理中间件 https://github.com/chimurai/http-proxy-middleware