与 Sapper 兼容的设置,可从单个 Express/Polka 入口点为多个应用程序提供服务

2024-01-05

我需要设置一台 Polka(或 Express)服务器,以便它可以从单个应用程序服务多个应用程序(每个主机名一个)服务器.js入口点。可以使用以下方法完成vhost中间件 (https://github.com/expressjs/vhost https://github.com/expressjs/vhost)。每个应用程序都导出为一个中间件,并且将每个请求对应的中间件添加到中间件链中服务器.js.

但是,这些应用程序中的一些(不是全部)将是 Sapper 应用程序,因此设置必须与 Sapper 兼容。据我所知,Sapper 构建会生成一个服务器.js文件作为应用程序的入口点,但应用程序不会导出。是否有一个构建选项可以导出 Sapper 应用程序(而不是执行listen在上面)?或者还有其他方法可以做到这一点?

我尝试手动编辑构建,它似乎可以工作,尽管文件路径存在一些问题,因为 Sapper 应用程序的根目录不是主应用程序的根目录。

我查过这个问题,但没有找到任何参考,所以我想知道我是否走错了路,是否有更明显的解决方案。 (注意:我使用的 Node.js 托管不允许将主机名映射到应用程序文件夹,这当然会让事情变得更简单。)


解决方案#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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 Sapper 兼容的设置,可从单个 Express/Polka 入口点为多个应用程序提供服务 的相关文章

随机推荐