Node.js 来自mongoose回调的Express js res.redirect()不工作

Node.js 来自mongoose回调的Express js res.redirect()不工作,node.js,express,mongoose,Node.js,Express,Mongoose,我想做的是 从/expense/new页面提交POST请求至/expense/newPost 在Expressjs上,以这种方式处理 app.post('/expense/newPost', function(req, res) { ... 继续,使用mongooseI将集合验证为 tmpExp = new Expense(req.body); tmpExp.validate(function(err) { if(err || !isValidForm) { req.sessio

我想做的是

/expense/new
页面提交
POST
请求至
/expense/newPost

在Expressjs上,以这种方式处理

app.post('/expense/newPost', function(req, res) { ...
继续,使用
mongoose
I将集合验证为

tmpExp = new Expense(req.body);

tmpExp.validate(function(err) {
  if(err || !isValidForm) {
    req.session.form.errField =  _.extend(req.session.form.errField, (err.errors || err ));
    req.session.rePop = req.body;
    res.redirect('/expense/new');
  } else {
    console.log('now saving') // successfully logs here.
    tmpExp.save(expPost, function(err2, savedDoc) {
      if(err2) {
        req.session.flash = { 
            global: true
          , css: "error"
          , message: "Internal Server Error"
        }
        res.redirect('/expense/new');
      } else {
        res.redirect('/expense/new?success=' + savedDoc.bill_id);
      }
    });
  }
});
为了清晰起见,我删除了一些验证代码


现在的问题是,通过浏览器提交POST请求后,数据成功保存在mongodb中,但浏览器没有重定向,只是等待服务器的响应

假设验证码是从该文件中剥离的唯一内容,
res
没有定义。我建议您只返回Error或null,并在父函数中执行剩余的逻辑,其中可能存在res。这通常也是一个很好的实践,因为您的模型是可重用的(模型中没有路径部分)

假设验证代码是您从该文件中剥离的唯一内容,则未定义res。我建议您只返回Error或null,并在父函数中执行剩余的逻辑,其中可能存在res。这通常也是一个很好的做法,因为您的模型是可重用的(模型中没有路径部分)

您的保存回调没有正确传入

tmpExp.save(expPost, function(err2, savedDoc) {
应该是:

tmpExp.save(function(err2, savedDoc) {

您的保存回调未正确传入

tmpExp.save(expPost, function(err2, savedDoc) {
应该是:

tmpExp.save(function(err2, savedDoc) {

如果你查看Chrome的网络检查器,你能看到任何位置标题吗?代码中的其他内容是否已经发送了数据?@loganfsmyth在Chrome的network inspector请求中,在
newPost
上显示挂起2-3分钟,然后
No data received
页面显示(我的意思是,由于在预定义的时间内没有收到数据,浏览器会关闭连接)@loganfsmyth抱歉,服务器在未发送任何数据的情况下关闭了连接,如chrome的
未接收到数据
页面所示
Error 324(net::ERR\u EMPTY\u RESPONSE):服务器在未发送任何数据的情况下关闭了连接
处理程序中没有任何
res.end()
调用,是吗?在这里发布可能太多了,但如果您准备在JSFIDLE或其他东西中发布您的整个处理程序,那么这可能会很有用。@loganfsmyth我认为您不需要在
res.redirect()之后调用
res.end()
,如果您查看Chrome的网络检查器,您可以看到任何位置标题吗?代码中的其他内容是否已经发送了数据?@loganfsmyth在Chrome的network inspector请求中,在
newPost
上显示挂起2-3分钟,然后
No data received
页面显示(我的意思是,由于在预定义的时间内没有收到数据,浏览器会关闭连接)@loganfsmyth抱歉,服务器在未发送任何数据的情况下关闭了连接,如chrome的
未接收到数据
页面所示
Error 324(net::ERR\u EMPTY\u RESPONSE):服务器在未发送任何数据的情况下关闭了连接
处理程序中没有任何
res.end()
调用,是吗?在这里发布可能太多了,但如果您准备在JSFIDLE或其他东西中发布您的整个处理程序,那么这可能会很有用。@loganfsmyth我认为您不需要在
res.redirect()之后调用
res.end()
请参阅对这个答案的评论否,这不在
app.post('/expense/newPost',function(req,res)中的模型中{
No,这不在app.post('/expense/newPost',function(req,res){