node.js,async和if语句

时间:2013-11-01 15:35:41

标签: javascript node.js if-statement mongoose

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

为什么?我的英语不好 。所以让我用日文写。遗憾。

パラメータで送られた値を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正常系统中删除之后不会返回到上一个屏幕。 (谷歌翻译) エラーケースはうまくいきましたが,正常系は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 个答案:

答案 0 :(得分:0)

代码中存在结构错误:

  1. async.forEachSeries(arraydeletethread的迭代器函数中调用了回调next - 它将被多次调用(因为迭代器是为列表中的每个项执行的),这是错误的。你只需要调用一次。 res.redirect
  2. 也是如此
  3. arraydeletethreadarraydeletepost数组的异步块也应包含在async.waterfall或其他内容中。然后应该在此包装异步语句的最终回调中调用nextredirect,而不是更早。
  4. P.S。使用谷歌翻译,它运作良好。