Совместимая с сапером настройка для обслуживания нескольких приложений с одной точки входа Express / Polka

#node.js #express #sapper #polka

#node.js #экспресс #sapper #polka

Вопрос:

Мне нужно настроить сервер Polka (или Express), чтобы он мог обслуживать несколько приложений (по одному на имя хоста) с одного server.js точка входа. Это можно сделать с помощью vhost промежуточного программного обеспечения (https://github.com/expressjs/vhost ). Каждое приложение экспортируется как промежуточное программное обеспечение, а то, которое соответствует каждому запросу, добавляется в цепочку промежуточного программного обеспечения в server.js .

Однако некоторые (не все) из этих приложений будут приложениями Sapper, поэтому настройка должна быть совместима с Sapper. Насколько мне известно, сборки Sapper генерируют server.js файл, который служит точкой входа для приложения, но приложение не экспортируется. Есть ли опция сборки для экспорта приложения Sapper (вместо того, чтобы делать listen это на нем)? Или какой-то другой способ сделать это?

Я попытался вручную отредактировать сборку, и, похоже, это работает, хотя есть некоторые проблемы с путями к файлам, потому что корень приложения Sapper не совпадает с корнем основного приложения.

Я искал эту проблему, но не нашел никаких ссылок на нее, поэтому мне интересно, не иду ли я по неверному пути и есть ли более очевидное решение. (Примечание: Node.js хостинг, который я использую, не позволяет сопоставлять имена хостов с папками приложений, что, конечно, упростило бы задачу.)

Ответ №1:

Решение № 1: экспортировать приложение Sapper в качестве промежуточного программного обеспечения

Вы можете создать свой собственный экспорт приложения Sapper. В server.ts/server.js из вашего приложения Sapper вместо запуска сервера вы можете экспортировать промежуточное программное обеспечение. Что-то вроде этого:

 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: используйте обратный прокси

Другим решением было бы запускать все вложенные приложения в разных портах на сервере и использовать прокси-сервер revers для соответствующей маршрутизации запросов.

Для запуска вложенных приложений на разных портах возможным решением будет их настройка или использование pm2.

Для обратной прокси-части вы можете использовать Nginx или Traefik. Также можно написать промежуточное программное обеспечение обратного прокси-сервера для его программной обработки с использованием http-proxy-middleware

Комментарии:

1. Спасибо за ваш ответ. Это то, что я имел в виду, когда сказал, что отредактировал сборку вручную. Это работает, но это означает изменение этого файла при каждой сборке. И есть дополнительная проблема с путями к файлам. В моем тестовом приложении файл JSON загружается из локальной файловой системы. Когда приложение запускается с верхнего уровня server.js , путь к этому файлу нарушен. В целом, выполнение всего этого вручную не представляется жизнеспособным.

2. @Nicolaslethierryd’Ennequin Спасибо за объяснение. Почему вам нужно изменять файл при каждой сборке? Это из-за среды разработки?

3. Ваш комментарий заставил меня понять, что я вносил изменения __sapper__/build/server/server.js , когда я, очевидно, должен был внести изменения один раз src/server.js . Это, вероятно, решает основную часть проблемы. Я собираюсь проверить, спасибо!