лямбда-функция, использующая узел js, запрашивающий файл S3 json - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть файл json, загруженный на s3, затем я написал следующий код, чтобы просмотреть содержимое этого файла

const aws = require('aws-sdk');
const s3 = new aws.S3();
const bucket = 'hotels.mserver.online';
const objectKey = 'hotelsrates.json';

exports.handler = (event,context,callback) => {
    // TODO implement

    const response = getS3Objects(bucket,objectKey); //s3.listObjectsV2({}).promise();
    console.log(response);
};

function getS3Objects(bucket,key) {
    return s3.getObject({ Bucket:bucket, Key:key, ResponseContentType:'application/json '})
        .promise().then(file => { return file })
        .catch(error => { return error });
}`

, но все равно получил значение null.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Другой способ сделать это можно следующим образом:

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

async function readFile(Bucket, Key) {
  const params = {
    Bucket,
    Key,
    ResponseContentType: 'application/json',
  };

  const f = await s3.getObject(params).promise();
  return f.Body.toString('utf-8');
}

readFile('mybucket', 'xyz.json').then(console.log);
0 голосов
/ 09 февраля 2019

Я понимаю, что вы пытаетесь сделать здесь, но это не правильный способ сделать это.

function getS3Objects(bucket,key){
    return s3.getObject({Bucket:bucket,Key:key,ResponseContentType:'application/json'})
               .promise().then(file=>{return file})
               .catch(error =>{return error});
}`

В приведенной выше части все еще будет возвращаться объект обещания, а это значит, что вам нужно с ним справитьсясоответственно.Вместо const response = getS3Objects(bucket,objectKey); вы хотите выполнить

getS3Objects(bucket,objectKey).then(response => console.log(response));

Внутри вашей функции handler.

Кроме того, использование функции s3.getObject неверно.Где первый аргумент является объектом - параметрами, а второй аргумент является функцией обратного вызова.

s3.getObject(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(data);

Поэтому в вашем случае вы хотите немного изменить свою функцию getS3Objects.Если вы хотите использовать обещания, то вы можете сделать это следующим образом.

function getS3Objects(bucket, key) {
    return new Promise((resolve, reject) => {
        s3.getObject(
            {
                Bucket: bucket,
                Key: key,
                ResponseContentType: 'application/json'
            },
            (err, data) => {
                if (err) {
                    reject(err);
                } else {
                    resolve(data);
                }
            }
        );
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...