等待文件上传完成的有效方法(猫鼬)

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批量保存功能,一切顺利