节点JS请求响应不起作用

时间:2017-08-03 05:37:20

标签: node.js

这是我的注册路线。如果注册成功,我想重定向到秘密路线。但是响应不起作用。当它成功时,页面会继续加载和加载,并且不会将我重定向到秘密路径。

app.post('/register', function(req, res) {
   User.create({
        username: req.body.username,
        password: req.body.password,
        email:    req.body.email
    }, function(err, result, res) { **HERE**
          if(err) throw err;
          res.redirect('/secret');
          console.log(result);
    });
});

我试过这个并且/ secret路由有效,但是当我这样做时,它不检查注册错误并立即重定向到秘密路由。

  app.post('/register', function(req, res) {
       User.create({
            username: req.body.username,
            password: req.body.password,
            email:    req.body.email
        }, function(err, result) { **HERE**
              if(err) throw err;
              console.log(result);
        });
        res.redirect('/secret');
    });

我试图添加返回错误。因此,如果出现错误,该功能将退出。 但是,当我故意在注册中出错时,仍然会显示/ secret路径。所以返回不会退出函数。

app.post('/register', function(req, res) {
    User.create({
        username: req.body.username,
        password: req.body.password,
        email:    req.body.email
    }, function(err, result) {
        if(err) return err; **TRIED RETURN TO EXIT**
    });
    res.redirect('/secret');
});

2 个答案:

答案 0 :(得分:1)

它继续加载和加载表明create user函数在回调中返回错误。或者在回调中发生错误。

如果出现错误,可能无法发送响应,这将导致悬空请求。

在您的代码中,原因是您必须从创建用户回调中删除res,否则您将隐藏middelware回调的原始res,这将导致错误。但是,当创建用户本身导致错误时,您还必须处理这种情况。

你的回调可能看起来那样:

function(err, result) { 
      if(err) {
          res.status(500).send('an error occured')
      } else {
         res.redirect('/secret');
         console.log(result)
      }
}

回调应该如何显示取决于您在错误的情况下想要做什么。您可能还想选择一个与500不同的错误代码,以便更好地匹配。

答案 1 :(得分:-1)

我相信您会将普通NodeJS中基于回调的异步编程特性与常规顺序编程混淆。

User.create的调用将立即返回,其后的行将在您提供的回调中的任何内容之前执行。因此,您的res.redirect()调用将触发重定向到客户端的即时响应。当回调最终运行时,请求已完成。

相反,您需要在检查潜在错误后执行回调函数内部的重定向。

您的代码应该看起来像这样:

app.post('/register', function(req, res) {
    User.create({
        username: req.body.username,
        password: req.body.password,
        email:    req.body.email
    }, function(err, result) {
        if(err) throw err;
        // Since we got here, things went well presumably
        res.redirect('/secret');
    });
});