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)
})
});
}
更改摘要:
- 更改函数名称以更好地描述它们的作用
- 使用
let responses = await Promise.all()
从 promise 数组中获取数据。
- 使用
fs
模块中的 promise 接口和 await fsp.writeFile()
将数据写出到您的文件。
- 使用 try/catch 在一个地方捕获所有承诺拒绝
可能的未决问题:
- 将此
Buffer.concat(responses)
写入磁盘似乎有点奇怪。这真的是您在此文件中想要的吗?
所以我在做我的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)
})
});
}
更改摘要:
- 更改函数名称以更好地描述它们的作用
- 使用
let responses = await Promise.all()
从 promise 数组中获取数据。 - 使用
fs
模块中的 promise 接口和await fsp.writeFile()
将数据写出到您的文件。 - 使用 try/catch 在一个地方捕获所有承诺拒绝
可能的未决问题:
- 将此
Buffer.concat(responses)
写入磁盘似乎有点奇怪。这真的是您在此文件中想要的吗?