繁体   English   中英

node.js,异步和if语句

[英]node.js ,async and if statement

下面的代码返回消息“错误:发送标头后无法设置标头。”

为什么?? 我的英语不好 。 所以让我用日语写。 抱歉。

パラメータで送られた値を2种の配列に変えて,それぞれの値をキーにmongodbから削除しようと以下のコードを书いたんですが,上のメッセージがでてきてうまくいきません。が违ったらエラーページへ飞ばしてうまくいったら,res.redirect( '返回')で元の画面に戻したいのですが,よいアドバイスがありましたらご教授お愿いします。

app.post('/thread/remove', function(req, res, next) {
var deletethread = req.param('deletethread'),
  deletepost = req.param("delete_post"),
  localpassword = req.param('localpassword'),
  category_id = req.param('category_id'),
  arraydeletethread = String(deletethread).split(","),
  arraydeletepost = String(deletepost).split(","),
  error_flag = false;

  console.log("arraydeletethread = " + arraydeletethread + ", arraydeletethread.length = " + arraydeletethread.length);
   if (deletethread) {
if(arraydeletethread.length > 0) {
  async.forEachSeries(arraydeletethread, function(val, callback) {
    if (val) {
      ThreadModel.findOne({post_id: Number(val)}, function(err, threadResult) {
        if(err) {
          console.log('error');
          return next(err);
        }
        if (threadResult.password !== localpassword) {
          error_flag = true;
          req.flash('errors', 'wrong password');
          req.flash('category_id', category_id);
          return res.redirect("/post/error");
        } else {
          threadResult.remove();
          console.log('remove suceeded!');
        }
      });
    }
  }, function() {
    console.log('thread remove finished!');
  });
}
  }

  console.log("arraydeletepost = " + arraydeletepost + ", arraydeletepost.length = " +   arraydeletepost.length);
  if (deletepost) {
if(arraydeletepost.length > 0){
  async.forEachSeries(arraydeletepost, function(val, callback) {
    if (val) {
      var arraydeletepost_i = String(val).split("_");
      ThreadModel.findOne({'replies.post_id': Number(arraydeletepost_i[1]), "post_id": Number(arraydeletepost_i[0])}, function(err, replyResult){
        if(err) {
          console.log('error');
          return next(err);
        }
        if (replyResult.password !== localpassword) {
          error_flag = true;
          req.flash('errors', 'wrong password');
          req.flash('category_id', category_id);
          return res.redirect("/post/error");
        } else {
          ThreadModel.update({post_id: Number(arraydeletepost_i[0])},{$pull: {replies: {post_id: Number(arraydeletepost_i[1])}}}, function(err){
            if(err) {
              console.log('error');
              return next(err);
            }
            console.log('remove suceeded!');
          });
        }
      });
    }
  }, function() {
    console.log('post remove finished!');
  });
}
  }
  return res.redirect('back');
});

我这样更改了代码。 错误情况进行得很顺利,但是从mongodb普通系统中删除该程序后,该过程不再返回,也不会返回上一屏幕。 (Google翻译)正常ラーケースはうまくいきましたが,正常系はmongodbから削除できたあとに前の画面に戻らず处理が帰ってこなくなりました...

app.post('/thread/remove', function(req, res, next) {
var deletethread = req.param('deletethread'),
  deletepost = req.param("delete_post"),
  localpassword = req.param('localpassword'),
  category_id = req.param('category_id'),
  arraydeletethread = String(deletethread).split(","),
  arraydeletepost = String(deletepost).split(",");

console.log("arraydeletethread = " + arraydeletethread + ", arraydeletethread.length = " + arraydeletethread.length);
console.log("arraydeletepost = " + arraydeletepost + ", arraydeletepost.length = " +   arraydeletepost.length);

async.parallel([
  function(callback) {
    if (deletethread) {
      if(arraydeletethread.length > 0) {
        async.forEachSeries(arraydeletethread, function(val, callback) {
          if (val) {
            ThreadModel.findOne({post_id: Number(val)}, function(err, threadResult) {
              if(err) {
                console.log('error');
                return callback("err = " + err);
              } else {
                if (threadResult.password !== localpassword) {
                  console.log('wrong password error');
                  return callback(new Error("wrong password error"));
                } else {
                  threadResult.remove();
                  console.log('remove suceeded!');
                  callback();
                }
              }
            });
          }
        }, function() {
          console.log('forEach thread finished');
        });
      }
    }
  },
  function(callback) {
    if (deletepost) {
      if(arraydeletepost.length > 0){
        async.forEachSeries(arraydeletepost, function(val, callback) {
          if (val) {
            var arraydeletepost_i = String(val).split("_");
            ThreadModel.findOne({'replies.post_id': Number(arraydeletepost_i[1]), "post_id": Number(arraydeletepost_i[0])}, function(err, replyResult){
              if(err) {
                console.log('error');
                return callback(err);
              } else {
                if (replyResult.password !== localpassword) {
                  console.log('wrong password error');
                  return callback(new Error("wrong password error"));
                } else {
                  ThreadModel.update({post_id: Number(arraydeletepost_i[0])},{$pull: {replies: {post_id: Number(arraydeletepost_i[1])}}}, function(err){
                    if(err) {
                      console.log('error');
                      return callback(err);
                    } else {
                      console.log('remove suceeded!');
                      callback();
                    }
                  });
                }
              }
            });
          }
        }, function() {
          console.log('forEach post finished');
        });
      }
    }
  }
],function(err) {
  if (err) {
    if (err.message === 'wrong password error') {
      req.flash('errors', 'パスワードが違います。');
      req.flash('category_id', category_id);
      return res.redirect("/post/error");
    } else {
      return next(err);
    }
  } else {
    res.redirect('back');
  }
});
});

代码中存在结构错误:

  1. async.forEachSeries(arraydeletethread的迭代器函数中, next回调被调用-它会被调用多次(因为对列表中的每个项目都执行了迭代器),这是错误的。您只需调用一次即可。用于res.redirect
  2. arraydeletethreadarraydeletepost数组的异步块也应该包装在async.waterfall东西中。 然后,应该在此包装的async语句的最终回调中调用nextredirect ,而不是更早。

PS使用Google翻译,效果很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM