【问题标题】:How to render ONLY one view?如何只渲染一个视图?
【发布时间】:2011-12-05 21:59:37
【问题描述】:

我正在使用 Node.JS 和 Express Web 框架,我的 res.render() 有问题

我有这个功能:

exports.init = function(){

    return function(req, res, next) {   

        /* FORM CONTACT */
        if (req.body.contact){                      

            model.validateContact(function(e){              
                if (err) res.render('contacts', {'error': err})

                else {
                    model.sendContact(function(err){                                                
                        if (err) 
                            res.render('contacts', {'error': err})                              
                        else
                            res.redirect('/success')                                                        
                    })                                  
                }               
            })      

        }
        /* CONTACT */       

        res.render('contacts')
        console.log('after')
    }

}

这里我有一个问题,因为 init 函数中不存在 res.render(我指的是内部函数(validateCONtact 和 sendContact)中的 res.render,所以最后一个 res.render('contacts') 将始终被执行。

如果我呈现页面,为什么脚本会继续其进程?我怎么可能做 res.render() 不止一次?

谢谢

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    试试这个:

    exports.init = function() {
    
      return function(req, res, next) {
        /* FORM CONTACT */
        if (req.body.contact){
          model.validateContact(function(e) {
            if (err) {
              res.render('contacts', {'error': err});
            } else {
              model.sendContact(function(err) {
                if (err) {
                  res.render('contacts', {'error': err});
                } else {
                  res.redirect('/success');
                }
              });
            }
          });
        } else {
          /* CONTACT */
          res.render('contacts');
          console.log('after');
        }
      }
    }
    

    【讨论】:

    • 无论如何我都会在遇到错误后推荐return,否则您的主代码将始终包含在else 子句中。
    • 当你确实只有超过 1-2 个 else-if 时,Return 会更有用。
    【解决方案2】:

    在拨打res.render() 后只需return。例如:

    if (err){
        res.render('contacts', {'error': err})
        return
    }
    

    【讨论】:

    • 我不能在内部函数中进行返回,如果我这样做了,我会从那里“退出”而不是从主函数(初始化函数)。
    • @Dali 对,没注意,虽然你只需要返回两次。
    【解决方案3】:

    每次您执行 res.redirectres.render 时,您都应该返回,因为如果不这样做,您将收到“之后无法发送标头” .." 错误,因为您将渲染另一个视图。

    【讨论】:

    • 我试过了,它不起作用,如果我在内部函数(validateContact 或 sendContact)内的 res.render(或 res.redirect)上使用 return,我得到“错误:不能使用可变标头发送后的 API。”因为最后的 res.render 总是会被执行。
    猜你喜欢
    • 2019-10-14
    • 2019-01-05
    • 2013-11-19
    • 2012-12-23
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多