1

以下のコードは、「エラー: 送信後にヘッダーを設定できません」というメッセージを返します。

どうして??私の英語は下手です。じゃあ日本語で書かせてください。ごめん。

パラメータで受け取った値を2種類の配列に変えて、それぞれの値をキーにmongodbから削除しようと以下のコードを書いたたんですが、上のメッセージが届いてうまくいきません。が違うエラーになったらページへ飛ばしてうまくいったら、res.redirect('back')で元の画面に戻したいのですが、よいアドバイスがありましたらご教授お願いします。

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');
  }
});
});
4

1 に答える 1

0

コードに構造的なエラーがあります:

  1. async.forEachSeries(arraydeletethreadコールバックのイテレータ関数でnext呼び出されます - 何度か呼び出されます (リスト内のすべてのアイテムに対してイテレータが実行されるため)。これは誤りです。一度だけ呼び出す必要があります。同じres.redirect
  2. arraydeletethreadおよび配列の非同期ブロックも、または何かarraydeletepostでラップする必要があります。async.waterfall次に、このラッピング非同期ステートメントの最後のコールバックでnextorを呼び出す必要があります。それ以前ではありません。redirect

PSはGoogle翻訳を使用していますが、非常にうまく機能します。

于 2013-11-01T15:57:59.853 に答える