在我的Express服务器中,根get
请求在async function
完成列出数据库文件之前发生,但是get
请求需要该函数提供的信息以正确呈现页面。如何让get
请求等到其他功能完成?
我看过其他解决方案:
Request - Wait till API call is completed Node.js
How to get Express Node route to wait for function before rendering
Wait a async operation before execute render in express using NodeJs
但是答案似乎不足以解决我的问题。
async function listFiles() {
artWorks = [];
const [files] = await storage.bucket(bucketName).getFiles();
files.forEach(file => {
function splitStr(str) {
var string = str.split("/");
artWorks.push(
{
imgCategory: string[0],
subCat: string[1].replace(/-/g, ' '),
imgSrc: bucket + file.name,
thumbnail: thumbBucket + file.name.split('.')[0] + "-thumb.jpg",
alt: string[2]
});
}
var str = file.name;
splitStr(str);
});
console.log("files listed");
}
listFiles().catch(console.error);
app.get("/", function(req, res) {
let randomArt = Math.floor(Math.random()*artWorks.length);
setTimeout(() => {
res.render("index", {
randomArt: randomArt,
artWorks: artWorks
})
}, 500);
});
您可以看到我当前的解决方案是将res.render
放在setTimeout
内以使其等待,但是我设置了任意时间,有时它不起作用。它呈现的页面"index"
使用artWorks
数组的随机选择的索引,如果数组索引大于50,则listFiles()
函数尚未完成,因此无法加载主页说:
TypeError: Cannot read property 'imgCategory' of undefined
一些注意事项:
在我在根listFiles()
请求之外的代码的其他部分中调用get
函数时,它必须独立于get
请求。
第一次有人访问该网站时,它将引发错误并且不呈现页面,但是在刷新artWorks
数组之后,页面将呈现,我认为是因为它已经缓存了必要的信息点。
那么在保持功能独立的同时让渲染等待的最佳方法是什么?
答案 0 :(得分:1)
等待诺言通过更改而解决:
listFiles().catch(console.error);
收件人:
listFiles()
.then(() => {
app.get("/", function(req, res) {
let randomArt = Math.floor(Math.random()*artWorks.length);
res.render("index", {
randomArt: randomArt,
artWorks: artWorks
})
});
})
.catch(console.error);