快速:通过api调用获得其他响应后发送响应

时间:2018-09-26 10:25:56

标签: node.js

我希望我的网站在成功的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()

})

2 个答案:

答案 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上拒绝它。然后使回调asyncawait进行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()

})