渲染没有响应对象的玉视图

时间:2014-04-12 19:16:04

标签: javascript node.js express pug

我有一个复杂的异步回调链,在链中的任何一点,如果出现错误,我想用错误信息渲染一个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 个答案:

答案 0 :(得分:1)

首先,我会看一下https://github.com/caolan/async来清理你的一系列异步调用。许多嵌套几乎是不可读的。看起来serieswaterfall符合您的需求。这也将大大减少您需要编写partnerErr并将所有错误检查逻辑移动到一个位置的次数。

话虽如此,为什么不将res传递给partnerErr并使用res.render?我能正确理解你的问题吗?

<强>更新

我强烈建议您按照我上面的说法考虑改写,但是,如果你想不管它,你可以这样做:

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真正基于这个片段的解耦方式。