是否有必要为Node.js中的每个请求创建一个新的S3客户端对象?
const aws = require('aws-sdk');
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
const s3 = new aws.S3();
const params = {
Bucket: "examplebucket",
Key: "HappyFace.jpg"
};
s3.getObject(params, (err, data) => {
if (err) console.log(err, err.stack); // an error occurred
else res.send(data);
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
这只是一个示例代码,但const s3 = new aws.S3();
的位置对我来说至关重要。假设服务并行处理数千个请求,然后生成数千个S3对象。目前,该服务可以毫无问题地处理它。我的问题是,有必要吗?如果我只在路由定义上面创建了一个S3对象,当代码更改为
...
const s3 = new aws.S3();
app.get('/', (req, res) => {
const params = {
Bucket: "examplebucket",
Key: "HappyFace.jpg"
};
s3.getObject(params, (err, data) => {
if (err) console.log(err, err.stack); // an error occurred
else res.send(data);
});
...
当你这样做的时候:
const s3 = new aws.S3();
你只是在实例化AWS SDK提供的S3类,因此唯一可能出现问题的是,如果你需要实例的不同初始配置,例如区域,版本…
也就是说,从您提供的代码来看,在端点之外实例化S3类是可以的,而且这可能也是一种很好的实践。
绝对不是。这里的s3对象是您将从AWS sdk中使用的api子集的管理器实例,而不是s3对象表示。
除非你正在做一些非常具体的事情(这在问题中并不精确,所以我认为情况并非如此),否则你最好将其设置在app.get部分上方。
如果s3 api的sdk配置对于每个请求必须不同(例如:如果您需要为每个请求使用不同的aws凭据或为每个请求将对象存储在不同的区域),您只会采用您提到的第一种方式