javascript - 从 AWS S3 到 Node.js 服务器的文件检索,然后到 React 客户端
问题描述
我需要使用 Express.js 从 Node.js 检索单个文件。为此,我安装了aws-sdk
, 以及@aws-sdk/client-s3
. 我可以使用这个简单的端点成功地获取文件:
const app = express(),
{ S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'),
s3 = new S3Client({ region: process.env.AWS_REGION });
app.get('/file/:filePath', async (req,res) => {
const path_to_file = req.params.filePath;
try {
const data = await s3.send(new GetObjectCommand({ Bucket: process.env.AWS_BUCKET, Key: path_to_file }));
console.log("Success", data);
} catch (err) {
console.log("Error", err);
}
});
...但我不知道如何data
正确返回到 React.js 前端,以便可以进一步下载文件。我试图查找文档,但它看起来对我来说太乱了,我什至无法得到函数返回的内容。.toString()
方法没有帮助,因为它只是返回 `"[object Object]" 而没有别的。
在 React 上,我使用了一个库file-saver
,它与 blob 一起使用,并使用用户定义的文件名提供它们以供下载。
节点 v15.8.0、React v16.4.0、@aws-sdk/client-s3 v3.9.0、文件保护程序 v2.0.5
感谢您的提示和建议!非常感谢任何帮助。
解决方案
通常来自 S3 的数据作为缓冲区返回。文件内容是Body
响应中参数的一部分。您可能正在toString
对根对象进行操作。
您需要.toString()
在 body 参数上使用以使其成为字符串。
这是一些可能适用于用例的示例代码
// Note: I am not using a different style of import
const AWS = require("aws-sdk")
const s3 = new AWS.S3()
const Bucket = "my-bucket"
async getObject(key){
const data = await s3.getObject({ Bucket, key}).promise()
if (data.Body) {return data.Body.toString("utf-8") } else { return undefined}
}
要将其返回express
,您可以将其添加到您的路线中,并在获得最终数据后将其传回。
res.end(data));
在 React 中使用它应该与从任何其他 REST API 中获取值相同。
推荐阅读
- python - python 3登录级别有什么区别?
- mysql - 触发器允许每人 1 辆车
- spring-boot - Spring Boot 中具有安全性的 Swagger 配置示例
- xml - CPAN XML::DOM 错误安装 - 权限被拒绝
- mongodb - MongoDB在upsert中插入重复文档
- datatables - dc.js dataTable 使用 jquery dataTable 进行条件格式化
- web - 如何在 Web 逻辑服务器上安装 .crt 文件(SSL)?
- symfony - Doctrine SQL Query Order By ASC NULL Last
- angular - 捕获错误并返回 of(undefined) 会停止流(Angular 7,rxjs6)
- python - 计算后如何只打印总数?