Поскольку вы используете событие S3, вы можете получить s3 корзину и key , получив доступ к event.Records[0].s3.bucket.name
и event.Records[0].s3.object.key
.Это может быть легко сделано с помощью следующего кода:
const params = {
Bucket: event.Records[0].s3.bucket.name,
Key: event.Records[0].s3.object.key
};
s3.headObject(params, function(err, data) {
if (err) {
console.log(err, err.stack);
return;
}
console.log(data)
});
Просто убедитесь, что вы поместили это в свой обратный вызов БД, иначе вы потеряете его.
Я бы оченьрекомендуем вам использовать async / await , поскольку вам не придется иметь дело со знаменитым адом обратного вызова .Вот переработанный код:
"use strict";
const MongoClient = require('mongodb').MongoClient;
const MONGODB_URI = 'mongodb://cam_writer:1%40kGM%26LL%26gA5y7NVk1cvl9@cluster0-shard-00-00-hlygq.mongodb.net:27017,cluster0-shard-00-01-hlygq.mongodb.net:27017,cluster0-shard-00-02-hlygq.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true'; // or Atlas connection string
const AWS = require('aws-sdk')
const s3 = AWS.S3()
let cachedDb = null;
const connectToDatabase = uri => {
console.log('=> connect to database');
if (cachedDb) {
console.log('=> using cached database instance');
return Promise.resolve(cachedDb);
}
return MongoClient.connect(uri)
.then(client => {
cachedDb = client.db('events');
return Promise.resolve(cachedDb);
});
}
function insertIntoDb (db, obj) {
console.log('=> inserting data into db');
return db.collection('detection_events').insertOne(obj)
}
module.exports.handler = async (event) => {
const db = await connectToDatabase(MONGODB_URI);
const result = await insertIntoDb(db, {
bucket: event.Records[0].s3.bucket.name,
key: event.Records[0].s3.object.key
})
console.log(result)
//finally get the HEAD for the s3Object
const head = await s3.headObject({
Bucket: event.Records[0].s3.bucket.name,
Key: event.Records[0].s3.object.key
}).promise();
console.log(head)
return {
statusCode: 201,
body: JSON.stringify(result)
}
};
Этого должно быть достаточно, чтобы вывести вас из строя.
РЕДАКТИРОВАТЬ : я рекомендую вам взглянуть на официальный NodeJS SDK , поскольку его документация довольно хороша
РЕДАКТИРОВАТЬ 2 : согласно предложению Майкла , если ваши файлы могут содержать пробелы, используйте вместо этого decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "))
из event.Records[0].s3.object.key
EDIT 3 : Теперь, когда ваш код работает, вы сказали, что он добавляет «кучу» изображений в S3.S3 запустит столько событий, сколько вставлено изображений.Это означает, что N Lambdas будет ускоряться одновременно, поэтому каждый раз создается новое соединение MongoDB.
Один из возможных способов - ограничить число одновременных выполнений вашей функции Lambda меньшим, чтобы вы могли контролировать, какмногие соединения могут быть открыты одновременно.
Чтобы сделать это, перейдите на консоль Lambda и установите Concurrency на любой номер, который вы хотите (в приведенном ниже примере я использую 5).Этого должно быть достаточно, чтобы получить то, что вам нужно.