【问题标题】:Render Jade view without Response Object渲染没有响应对象的 Jade 视图
【发布时间】:2014-06-25 03:52:21
【问题描述】:

我有一个复杂的异步回调链,在链中的任何一点,如果有错误,我想渲染一个带有错误消息的 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);
    });
}

【问题讨论】:

    标签: javascript node.js express pug


    【解决方案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 的解耦方式是基于这个 sn-p 的。

    【讨论】:

    • 谢谢,这很有帮助!如果我将 res 传递给 partnerErr,是否还需要通过每个连续的回调传递它,以便当其中一个步骤失败时,可以回调它,例如:error(err, res)?
    • 啊很好,异步调用解决了我的 res.render 问题,但我想技术上不是问题。有没有办法从 app.render() 实例化一个新的响应?在这种情况下,看起来对 async.series() 的两次调用将起作用。一个用于验证 Parse 和 Shopify,另一个用于向每个 API 发布新合作伙伴。再次感谢
    猜你喜欢
    • 2018-08-06
    • 2017-04-09
    • 2019-07-06
    • 2017-06-10
    • 2014-01-15
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多