Временный маршрут загрузки в Экспресс? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть веб-приложение, которое загружается за минуту - так как ему нужно подключиться к базе данных и так далее, и некоторые другие вещи, которые требуют времени.

Как лучше всего использовать временный маршрут загрузки в Express?

Я хотел бы сделать что-то вроде следующего:

const express = require('express')
const app = express()

// Temporary / for if someone hits the server before it's finished starting
app.get('/', (req, res) => res.send(`Loading....`))

// In my non-demo app, there's a router here that takes a moment to load, instead of a timeout. 
setTimeout(function(){
  app.get('/', (req, res) => res.send(`Ready!`))
}, 3 * 1000)

app.listen(3000, () => console.log('Example app listening on port 3000!'))

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Если вашему приложению требуется некоторое время для правильной загрузки, лучше всего НЕ запускать сервер.

Оно очень хорошо работает, например, с балансировщиками нагрузки и несколькими контейнерами, так как они ожидают проверки / healthпройти, прежде чем они положили контейнер за балансировщик нагрузки.Что вы хотите сделать для современных сервисов.

Например, вот что:

import { app } from './app';
import { config } from './config';
import { logger } from './components/ourLog';
import { initPromise } from './components/ourMongo';

const port = config.server.port;

async function startServer() {
    await initPromise;
    app.listen(port, () => {
        logger.info(
            {
                port,
                params: config.params,
                processEnv: process.env,
            },
            'App has started'
        );
    });
}

startServer()
    .catch(err => {
        logger.error({ err }, 'Critical error, cannot start server');
        process.exit(1);
    });

У нас есть компонент, который подключается к Монго, и он предоставляет initPromise, что является обещанием, котороеразрешается после успешного подключения, и вы можете начать с использования базы данных.

0 голосов
/ 24 мая 2018

Вы можете пропинговать сервер "x" секунд, чтобы проверить, когда он будет готов.

Сервер

Мы создадим переменную ready, которая установлена ​​в false, когдався ваша база данных, API и другие вещи выполняются, делая то, что им нужно, установите для нее значение true.

Мы также создадим маршрут, такой как /ping, который будет отвечать значением ready.

const express = require('express')
const app = express()

let ready = false

// Do database stuff, API stuff, etc.
// Set ready to true when ready

// Temporary / for if someone hits the server before it's finished starting
app.get('/', (req, res) => res.send(`Loading....`))

app.get('/ping', (req, res) => res.json({ready}))

app.listen(3000, () => console.log('Example app listening on port 3000!'))

Клиент

Здесь мы будем пинговать сервер каждые "х" секунд, я устанавливаю его на 0,5 с, как только пинг вернет истину, мы отменяем тайм-аут и запускаем инициализациюкод, который создает страницу.

let timeout

timeout = setInterval(async () => {
  let response = await fetch('/ping')
  let ready = await response.json()
  if (ready.ready) {
    clearInterval(timeout)
    loadpage()
  }
}, 500)
0 голосов
/ 24 мая 2018

Маршруты не могут быть удалены во время выполнения , но вы можете добавить промежуточное ПО, которое проверяет, все ли инициализировано, если это не так, вы заканчиваете запрос с помощью: res.send('Loading'); в противном случае вы переходите кследующая промежуточная посуда.

let initialized = false;

app.get('/', (req, res, next) => {
    if(!initialized)
       return res.send('Loading...');
    next();
});

app.get('/', (req, res, next) => {
    res.send(`Ready!`);
});

setTimeout(() => initialized = true, 3000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...