writeFileSync 只写入一半数据

writeFileSync only write half of data

所以我在做我的project.The问题时遇到了一个问题,当我尝试将我的数据写入csv文件时,它只写入了一半的数据,甚至有时只写入不到我的一半data.I不知道是什么问题,因为终端没有显示错误。

下面是我的代码

async function getFile(req, res, next) {

    try {
        let URI;
        const listOfKeys = await listAllKeys();
        let temp = []

        await Promise.all(listOfKeys.map(async function (data) {
            let response = await writeFile(data.Key);
            temp.push(response)
        }))
            .then(async _ => {
                fs.writeFileSync(FILE_PATH, Buffer.concat(temp));
            })
            .catch(err => {
                console.log(err)
            })
        return res.json({ message: 'halo' });
    } catch (err) {
        console.log('hmm.... error', err);
        return next(new APIError(err, httpStatus.INTERNAL_SERVER_ERROR, true));
    };
};

这是 writeFile 函数

function writeFile(key) {
    return new Promise((resolve, reject) => {
        s3.getObject({ Bucket: process.env.AWS_BUCKET, Key: key }, (err, data) => {
            if (err) reject(err)
            else resolve(data.Body)
        })
    });
};

如果可能的话,我想知道我的问题的细节以及如何解决it.Thanks。

在我看来你可以这样做(函数名称已被修改以对我有意义):

const fsp = require('fs').promises;

async function getDataAndWriteFile(req, res, next) {
    try {
        let URI;
        const listOfKeys = await listAllKeys();

        let responses = await Promise.all(listOfKeys.map(function (data) {
            return getData(data.Key);
        }));
        await fsp.writeFile(FILE_PATH, Buffer.concat(responses);
        res.json({ message: 'halo' });
    } catch(err) {
        console.log('hmm.... error', err);
        next(new APIError(err, httpStatus.INTERNAL_SERVER_ERROR, true));
    }
}

function getData(key) {
    return new Promise((resolve, reject) => {
        s3.getObject({ Bucket: process.env.AWS_BUCKET, Key: key }, (err, data) => {
            if (err) reject(err)
            else resolve(data.Body)
        })
    });
}

更改摘要:

  1. 更改函数名称以更好地描述它们的作用
  2. 使用 let responses = await Promise.all() 从 promise 数组中获取数据。
  3. 使用 fs 模块中的 promise 接口和 await fsp.writeFile() 将数据写出到您的文件。
  4. 使用 try/catch 在一个地方捕获所有承诺拒绝

可能的未决问题:

  1. 将此 Buffer.concat(responses) 写入磁盘似乎有点奇怪。这真的是您在此文件中想要的吗?