'new AWS.S3' 实例应该是全局变量还是应该在每个路由中放置一个单独的 AWS.S3 实例?

Should 'new AWS.S3' instance be a global variable or should a separate AWS.S3 instance be placed in each route?

环境:Node.js,Express,AWS-SDK

目前我的 AWS.S3 实例是一个位于中间件顶部的全局变量。

const s3 = new AWS.S3({
    apiVersion: '2006-03-01',
    accessKeyId: process.env.S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
    region: process.env.S3_REGION
});

app.get('/page1', function(req, res) {
});

app.get('/page2', function(req, res) {
});

我在各种不同的路线中使用 AWS.S3。 我在后台异步使用 deleteObject()upload() 方法。但是,我也将 headObject()async/await 一起使用,因为在我可以移动到下一个操作之前我需要结果。

为了避免某种类型的 S3 冲突或其他意外问题,我应该在每个中间件的顶部放置一个新的 AWS.S3 实例吗?我不确定这是否必要。为了与 Mongoose 进行比较,它只需要一个语句 mongoose.connect() 并且会打开一个包含 5 个连接的池,可供应用程序中的每个路由使用。

app.get('/', function(req, res) {

    const s3 = new AWS.S3({
        apiVersion: '2006-03-01',
        accessKeyId: process.env.S3_ACCESS_KEY_ID,
        secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
        region: process.env.S3_REGION
    });

});

app.get('/page2', function(req, res) {

    const s3 = new AWS.S3({
        apiVersion: '2006-03-01',
        accessKeyId: process.env.S3_ACCESS_KEY_ID,
        secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
        region: process.env.S3_REGION
    });

});

多个功能最好共享一个S3实例。 S3 库(实际上 node.js 本身)已经可以处理到 S3 的多个连接。单个实例将使用更少的 RAM 并减少出现错误的可能性,以防您需要更改某些内容(它可以防止需要在整个地方进行更改)。

的确,理想情况下,您的所有文件都应使用一个 S3 实例。我通常在自己的模块中初始化 S3,然后导出实例。

示例:

// lib/s3.js

const s3 = new AWS.S3({
 apiVersion: '2006-03-01',
    accessKeyId: process.env.S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
    region: process.env.S3_REGION
});

module.exports = s3;

然后在我的其他代码中:

const s3 = require('./lib/s3');   

app.get('/page1', function(req, res) {
});

app.get('/page2', function(req, res) {
});