我希望我的网站在成功的api调用后做出响应,该调用是通过发布请求启动的,并且还更改了一些数据库值。
如果没有发布请求,则该站点也应照常加载。
如果我做这样的事情,那么该站点将照常加载,然后由于第二次渲染尝试而出现错误。
我猜是因为节点确实在等待receipt
,但是并行地已经执行了loadNewSite()
函数:
app.all('/customer', function(req, res) {
if (Object.keys(req.body).length != 0) {
apiCall(someParameter)
.on('error', error => {console.log(error);} )
.on('receipt', function() {loadNewSite();} );
}
function loadNewSite() {
return res.render('site.html');
}
loadNewSite()
})
答案 0 :(得分:1)
尝试删除最后一个loadNewSite(),因为当您on reciept
使用req.method
检查是否为POST
请求。
app.all('/customer', function(req, res) {
// if method is not post handle seperately
if(req.method != 'POST'){
return loadNewSite('site.html');
}
if (Object.keys(req.body).length != 0) {
apiCall(someParameter)
.on('error', error => {console.log(error);} )
.on('receipt', function() {loadNewSite();} );
}
function loadNewSite() {
return res.render('site.html');
}
})
答案 1 :(得分:0)
我会创建一个承诺来执行Api调用并在receipt
上解决它,或者在error
上拒绝它。然后使回调async
和await
进行api调用承诺。
在发生错误的情况下,我留下了对loadNewSite
的最终调用,很明显,您可以对其进行修改,并创建一个在错误情况下可能返回不同内容的函数。
const execApiCall = (params) => {
return new Promise((resolve, reject) => {
apiCall(params)
.on('error', error => {reject(error);} )
.on('receipt', function() {resolve();} );
})
};
app.all('/customer', async function(req, res) {
function loadNewSite() {
return res.render('site.html');
}
if (Object.keys(req.body).length != 0) {
try {
await execApiCall(params);
return loadNewSite();
} catch (e) { //handle errors }
}
loadNewSite()
})