等待文件上传完成的有效方法(猫鼬)
Effective way to wait until file upload has finished (Mongoose)
我目前正在使用 React 和 Mongoose (MongoDB) 开发一个应用程序,我在其中上传了一个文本文件,该文件包含大约 9000 多行,其中包含 JSON。每一行都很重要,我需要能够将其存储在数据库中以便以后访问。
我设置了两个函数,一个读取文件,一个为每个请求创建模型并将其保存到 MongoDB。
读取每一行的函数
const createAndReadFile = async (filePath) => {
//create a read stream of the File
let fileStream = fs.createReadStream(filePath, 'utf8');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
let parsedJSONLine = JSON.parse(line);
createAndAddToDB(parsedJSONLine);
}
};
每行添加到数据库的函数
const createAndAddToDB = async (jsonRequest) => {
try {
let request = new Request(jsonRequest);
await request.save();
} catch (error) {}
};
我的问题是,等待所有线都转换为模型并保存在数据库中的最有效方法是什么?
使用 Promise.all
等待在 for-await 循环中创建的所有承诺的解决:
var promises = [];
for await (const line of rl) {
let parsedJSONLine = JSON.parse(line);
promises.push(createAndAddToDB(parsedJSONLine));
}
return Promise.all(promises);
或者,您可以在for-await循环中执行转换并批量写入数据库:
var promises = [];
for await (const line of rl) {
let parsedJSONLine = JSON.parse(line);
promises.push(convertToDBFormat(parsedJSONLine));
}
return Promise.all(promises).then(function(converted) {
return addToDBBatch(converted);
});
const createAndReadFile = async (filePath) => {
//create a read stream of the File
let fileStream = fs.createReadStream(filePath, 'utf8');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for (const line of rl) {
let parsedJSONLine = JSON.parse(line);
await createAndAddToDB(parsedJSONLine);
}
return 'file is processed';
};
我猜你写对了。当循环结束时,它将是文件的最后一行。
现在,如果有任何未保存的行,您可以将它们推送到失败的数组中,然后将它们分批保存。
建议:另外,不要每次请求 9000+(行)时都将每一行都保存到数据库中,而应该使用批量插入。
当你退出循环时,你可以再次检查是否有未保存的行。 Re-run批量保存功能,一切顺利
我目前正在使用 React 和 Mongoose (MongoDB) 开发一个应用程序,我在其中上传了一个文本文件,该文件包含大约 9000 多行,其中包含 JSON。每一行都很重要,我需要能够将其存储在数据库中以便以后访问。
我设置了两个函数,一个读取文件,一个为每个请求创建模型并将其保存到 MongoDB。
读取每一行的函数
const createAndReadFile = async (filePath) => {
//create a read stream of the File
let fileStream = fs.createReadStream(filePath, 'utf8');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
let parsedJSONLine = JSON.parse(line);
createAndAddToDB(parsedJSONLine);
}
};
每行添加到数据库的函数
const createAndAddToDB = async (jsonRequest) => {
try {
let request = new Request(jsonRequest);
await request.save();
} catch (error) {}
};
我的问题是,等待所有线都转换为模型并保存在数据库中的最有效方法是什么?
使用 Promise.all
等待在 for-await 循环中创建的所有承诺的解决:
var promises = [];
for await (const line of rl) {
let parsedJSONLine = JSON.parse(line);
promises.push(createAndAddToDB(parsedJSONLine));
}
return Promise.all(promises);
或者,您可以在for-await循环中执行转换并批量写入数据库:
var promises = [];
for await (const line of rl) {
let parsedJSONLine = JSON.parse(line);
promises.push(convertToDBFormat(parsedJSONLine));
}
return Promise.all(promises).then(function(converted) {
return addToDBBatch(converted);
});
const createAndReadFile = async (filePath) => {
//create a read stream of the File
let fileStream = fs.createReadStream(filePath, 'utf8');
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
for (const line of rl) {
let parsedJSONLine = JSON.parse(line);
await createAndAddToDB(parsedJSONLine);
}
return 'file is processed';
};
我猜你写对了。当循环结束时,它将是文件的最后一行。
现在,如果有任何未保存的行,您可以将它们推送到失败的数组中,然后将它们分批保存。
建议:另外,不要每次请求 9000+(行)时都将每一行都保存到数据库中,而应该使用批量插入。 当你退出循环时,你可以再次检查是否有未保存的行。 Re-run批量保存功能,一切顺利