Express中的临时“装载”路线?

时间:2018-05-24 15:27:20

标签: javascript node.js express

我有一个需要花费时间加载的Web应用程序 - 因为它需要连接到数据库,所以其他一些需要时间的东西。

在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 :(得分:1)

路由can't be deleted at runtime,但您可以添加一个中间件来检查是否所有内容都已初始化,如果不是您使用以下内容结束请求:res.send('Loading');,否则您将转到下一个middeware。

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);

答案 1 :(得分:-1)

如果您的应用需要一些时间来正确加载,最好的选择是不让它启动服务器。

它与负载平衡器和多个容器一起工作得很好,因为它们在将容器放在负载均衡器后面等待/ 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);
    });

我们有连接到mongo的组件,它公开initPromise,这是promise,在连接完成后解析,你可以从使用db开始。

答案 2 :(得分:-1)

您可以ping服务器“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!'))

客户端

这里我们将每隔“x”秒ping一次服务器,我将其设置为0.5s,一旦ping返回true,我们取消超时并运行构建页面的初始化代码。

let timeout

timeout = setInterval(async () => {
  let response = await fetch('/ping')
  let ready = await response.json()
  if (ready.ready) {
    clearInterval(timeout)
    loadpage()
  }
}, 500)