'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) {
});
环境: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) {
});