【问题标题】:A Sapper-compatible setup to serve multiple apps from a single Express/Polka entry point与 Sapper 兼容的设置,可从单个 Express/Polka 入口点为多个应用程序提供服务
【发布时间】:2021-03-20 17:10:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js express sapper polka


    【解决方案1】:

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

    对于反向代理部分,您可以使用 Nginx 或 Traefik。也可以编写一个反向代理中间件来使用http-proxy-middleware以编程方式处理它

    【讨论】:

    • 感谢您的回答。这就是我说我手动编辑构建时的意思。它有效,但这意味着在每次构建时修改此文件。还有额外的文件路径问题。在我的测试应用程序中,从本地文件系统加载了一个 JSON 文件。当应用程序从顶级 server.js 运行时,此文件的路径会损坏。总而言之,手动完成所有这些似乎并不可行。
    • @NicolasLeThierryd'Ennequin 感谢您的解释。为什么每次构建时都需要修改文件?是开发环境的原因吗?
    • 您的评论让我意识到我正在修改__sapper__/build/server/server.js,而我显然应该在src/server.js 中进行一次更改。这可能解决了问题的主要部分。我去看看,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多