以下のコードは、「エラー: 送信後にヘッダーを設定できません」というメッセージを返します。
どうして??私の英語は下手です。じゃあ日本語で書かせてください。ごめん。
パラメータで受け取った値を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');
}
});
});