node.jsアプリケーションを作成しています。その機能の1つは、Excelファイルをアップロードし、それを読み取って内容をデータベースに保存することです。問題は、私がnode.jsを初めて使用していて、ノンブロッキングコードの概念を理解できないため、この関数がメインスレッドをブロックしているように見えるので、この問題を解決するためにいくつかの助けが必要です。node.jsアプリケーションのブロック機能
app.post('/admin/upload_file', function(req, res) {
var sampleFile;
if (!req.files) {
res.send('No files were uploaded.');
console.log('No files were uploaded.');
return;
}
sampleFile = req.files.sampleFile;
var fileArray = sampleFile.name.split('.');
var extension = fileArray[fileArray.length - 1];
if (extension == "xlsx") {
sampleFile.mv('./public/uploads/sample_file.xlsx', function(err) {
if (err) {
res.status(500).send(err);
} else {
var entries = parsing_file(req, res);
if (entries.length > 0) {
for (var i = 0; i < entries.length; i++) {
// this loop on database queries block the main thread
model.insert_in_db(entries[0], function(rows) {});
}
}
res.redirect('/admin');
}
});
} else {
res.redirect('/admin');
}
});
parsing_file
関数は、ファイルを解析し、配列にオブジェクトとして値を格納する、問題は(dBでの値を挿入する必要があり)、データベースクエリにループがメインスレッドとして起動したときに起動しますloopの作業が完了するまで、node.jsはブロックされます。
これは、特に私が 'async.eachLimit'の部分に関して特に探しているものですが、制限数を設定するベストプラクティスは何ですか?またはクエリが実行される時間に依存しますか? – Karim
async.leachLimitは、一度に最大非同期操作数を設定するために使用されます。各制限が並行して実行されるので、ループに保存するレコードが数千になると、ノードはコールスタックがいっぱいになり、エラーがスローされます。これを避けるために、制限されたレコードを並行して実行し、実行後に次のレコードを並列に実行するためにlimitを使用します。制限数はあなたのロジックに依存します。各リミット関数内で何をしているのですか? –