所以我将这个pdf文件上传到s3,这一切都很好,但第二步是从s3获取该pdf,这样我就可以随时下载它,但是当我到达下载步骤时,我得到一个0字节的文件,我在 s3 上检查并且文件正在通过那里正确下载...这是我从 s3 获取文件的代码,它也进入 if 条件,还检查了来自 s3 的缓冲区大小并且它不为空:
const s3 = new AWS.S3({
accessKeyId: process.env.AWS_ID,
secretAccessKey: process.env.AWS_SECRET
});
const params = {
Bucket: `${process.env.AWS_BUCKET_NAME}/receipts`,
Key: `${transactionId}.pdf`
};
s3.getObject(params, async (err, data) => {
if (err) {
rollbar.error(err);
new Logger().error(err);
return RouteResponse.error('Error retrieving file from S3', res);
}
if (data.Body && Buffer.isBuffer(data.Body)) {
return new HtmlPdf().renderBuffer(res, data.Body);
}
return RouteResponse.error('File data is not valid', res);
});
} else {
return RouteResponse.error('File not found or transaction does not exist', res);
}
这是我的渲染缓冲区:
/**
* renderBuffer
*
* @param { Response<unknown, Record<string, unknown>> }_res - Response
* @param { Buffer } buffer - Buffer do arquivo
*/
public async renderBuffer(_res: Response<unknown, Record<string, unknown>>, buffer: Buffer): Promise<void> {
const readStream = new stream.PassThrough();
readStream.end(buffer);
_res.setHeader('Content-type', 'application/pdf');
_res.setHeader('Content-disposition', `attachment; filename=report.pdf`);
readStream.pipe(_res);
}
```
几乎所有 AWS 开发工具包 API 调用都是异步的并返回承诺。如果您在回调中处理响应,如下所示,那么您对
get_object()
的调用会在 s3.getObject
回调发生之前完成,并且您的 `get_object() 函数实际上返回未定义。
function get_object(Bucket, Key)
{
s3.getObject({ Bucket, Key }, async (err, data) => {
if (err) {
console.error("GetObject failed, err=", err);
} else {
// this is the return value of the callback function and is
// NOT the return value of the get_object() call
return data.Body.toString('utf-8');
}
});
// implicit return undefined here
}
// data will (incorrectly) always be undefined
const data = get_object("somebucket", "somekey");
您可以修改代码以使用 async/await,例如:
async function get_object(Bucket, Key)
{
const data = await s3.getObject({ Bucket, Key });
return data.Body.toString('utf-8');
}
// data will (correctly) be the S3 object's body content
const data = await get_object("somebucket", "somekey");
另请注意,AWS JavaScript SDK v2 已更新,您应该考虑继续使用 v3。