2014-04-12 30 views
1

我有一個複雜的異步回調鏈,並在鏈中的任何點,如果有錯誤,我想呈現一個錯誤消息的Jade模板。渲染Jade視圖沒有響應對象

在下面的函數partnerErr中,是否可以使用沒有原始響應對象的模板進行響應?

app.post('/dashboard/partners/create', function (req, res) { 
    console.log(req.body); 

    ParseUtils.doesUserExist( 
     req.body.partnerEmail, 
     function() { ShopifyUtils.doesPartnerExist(req.body.partnerShopSlug, 
       function() { ParseUtils.createUser(req.body, 
        function() { ShopifyUtils.createPartner(req.body, 
         res.send(' all good. parse and shopify passed. user created. '), 
         partnerErr 
        ); }, 
        partnerErr 
       ); }, 
       partnerErr 
      ); 
     }, 
     partnerErr 
    ); 
}); 

function partnerErr(err) { 
    console.log('rendering partner error'); 
    app.render('admin/partnersCreate', { error : err }, function(err, html) { 
     console.log('html', html); 
    }); 
} 

回答

1

首先,我會看看https://github.com/caolan/async來清理您的一系列異步調用。那麼多嵌套幾乎是不可讀的。它看起來像serieswaterfall將滿足您的需求。這也將大大減少您需要編寫的次數partnerErr並將所有錯誤檢查邏輯移到一個地方。

這就是說,爲什麼不只是通過respartnerErr和使用res.render?我是否正確理解你的問題?

UPDATE

我會強烈建議您但是考慮重寫這正如我上面所說,如果你想獨自離開它,你可以做這樣的事情:

app.post('/dashboard/partners/create', function(req, res) { 
    console.log(req.body); 

    ParseUtils.doesUserExist(
    req.body.partnerEmail, 
    function() { 
     ShopifyUtils.doesPartnerExist(req.body.partnerShopSlug, 
     function() { 
      ParseUtils.createUser(req.body, 
      function() { 
       ShopifyUtils.createPartner(req.body, 
       res.send(' all good. parse and shopify passed. user created. '), 
       partnerErr(res) 
      ); 
      }, 
      partnerErr(res) 
     ); 
     }, 
     partnerErr(res) 
    ); 
    }, 
    partnerErr(res) 
); 
}); 

function partnerErr(res) { 
    return function(err) { 
    console.log('rendering partner error'); 
    res.render('admin/partnersCreate', { 
     error: err 
    }); 
    } 
} 

另一個選項是將partnerErr函數移動到與app.post相同的範圍內,並且只能訪問res變量。我不確定partnerErr的真正解耦是如何基於這個片段的。

+0

謝謝,這很有幫助!如果我將res傳遞給partnerErr,是否還需要將它傳遞給每個連續的回調函數,以便當其中一個步驟失敗時,可以回調它,例如:error(err,res)? – theLucre

+0

好啊,異步調用解決了我的res.render問題,但我想在技術上不是問題。有沒有辦法從app.render()實例化新的響應? 在這種情況下,它看起來像兩個調用async.series()將工作。一個爲Parse和Shopify驗證,另一個爲每個API發佈新的合作伙伴。再次感謝 – theLucre