我有一个需要花费时间加载的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!'))
答案 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)