【问题标题】:Query S3 json file in AWS在 AWS 中查询 S3 json 文件
【发布时间】:2019-07-03 14:34:03
【问题描述】:

我已将 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 });
}`

但结果为空。

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 aws-lambda


    【解决方案1】:

    我了解您在这里想要完成的工作,但这不是正确的方法。

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

    上面的部分仍然会返回一个promise对象,这意味着你需要相应地处理它。而不是你想做的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 函数。如果你想使用 Promise,那么你可以这样做。

    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);
                    }
                }
            );
        });
    }
    

    【讨论】:

    • 感谢您的评论,但响应仍然为空,我不知道为什么??
    • 如果我想通过 2 次过滤以在处理程序中得到类似这样的结果。
    • var params={"Bucket":bucket,"Key":key} s3.getObject(params, function(err, data) { if (err) console.log(err, err.stack ); // 发生错误 else { console.log(data); var json = JSON.parse(new Buffer(data.Body).toString("utf8")); SELECT * FROM json s WHERE s.hotelID =filter .ID 和 s.targetDay =filter.date // var json=JSON.stringify(data.Body); console.log(json); //console.log(json.find(filter)); } }); };
    【解决方案2】:

    另一种方法如下:

    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);
    

    【讨论】:

    • 请注意,您也可以将处理程序设置为异步函数,在这种情况下,您也可以在调用 readFile 时使用 async/await 语法。
    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2020-08-12
    • 2020-01-15
    • 2020-09-19
    相关资源
    最近更新 更多