Node.js AWS S3同步上传文件

Node.js AWS S3同步上传文件,node.js,amazon-web-services,amazon-s3,meteor,async-await,Node.js,Amazon Web Services,Amazon S3,Meteor,Async Await,我在服务器端使用Meteor,在服务器端使用方法调用返回数据 所以我尝试同步地将文件上传到AWS S3 Bucket 下面是一个示例代码: Meteor.methods({ uploadImage: function (params) { var AWS = Npm.require('aws-sdk'); AWS.config.loadFromPath(process.env["PWD"]+'/private/awss3/s3_c

我在服务器端使用Meteor,在服务器端使用方法调用返回数据

所以我尝试同步地将文件上传到AWS S3 Bucket

下面是一个示例代码:

Meteor.methods({

    uploadImage: function (params) {

        var AWS = Npm.require('aws-sdk');

        AWS.config.loadFromPath(process.env["PWD"]+'/private/awss3/s3_config.json');
        var s3Bucket = new AWS.S3( { params: {Bucket: 'users-profile-pictures'} } );

        buf = Buffer.from(params.baseimage.replace(/^data:image\/\w+;base64,/, ""),'base64')
        var data = {
          Key: params.fileName, 
          Body: buf,
          ContentEncoding: 'base64',
          ContentType: 'image/jpeg'
        };

        s3Bucket.putObject(data, function(err, data){
            if (err) { 
              console.log(err);
              console.log('Error uploading data: ', data); 
            } else {
              console.dir(data);
              console.log('successfully uploaded the image!');
            }
        });

        return data;
    },
});

现在我想返回我从AWS SDK回调中得到的响应。如何同步上传?

我不是AWS SDK专家,但根据我的经验,所有internet请求都是异步的,因为服务器需要时间来响应。无论如何,您需要在当前使用时使用它,或者需要异步执行所有脚本,然后添加wait标记以等待函数输出:
wait s3Bucket.putObject(…

我不是AWS SDK的专家,但根据我的经验,所有internet请求都是异步的,因为服务器需要时间来响应。无论如何,您需要按照当前使用的方式使用它,或者您需要异步执行所有脚本,然后添加wait标记以等待函数输出:
wait s3Bucket.putObject(…

在Meteor中,您使用
wrapAsync
进行异步调用同步:

const putObjectSync=Meteor.wrapAsync(s3Bucket.putObject);
流星法({
上载映像:函数(参数){
var AWS=Npm.require('AWS-sdk');
AWS.config.loadFromPath(process.env[“PWD”]+'/private/awss3/s3_config.json');
var s3Bucket=new AWS.S3({params:{Bucket:'users profile pictures'}});
buf=Buffer.from(params.baseimage.replace(/^data:image\/\w+;base64,/,“”)、“base64”)
风险值数据={
键:params.fileName,
正文:buf,
ContentEncoding:'base64',
ContentType:“图像/jpeg”
};
const result=putObjectSync(数据);
//请注意,错误将抛出一个异常,这是您想要的,如下所示
//它们由Meteor处理,让称为的方法知道
//出了问题。
返回结果;
},
});

在Meteor中,您可以使用
wrapAsync
进行异步调用同步:

const putObjectSync=Meteor.wrapAsync(s3Bucket.putObject);
流星法({
上载映像:函数(参数){
var AWS=Npm.require('AWS-sdk');
AWS.config.loadFromPath(process.env[“PWD”]+'/private/awss3/s3_config.json');
var s3Bucket=new AWS.S3({params:{Bucket:'users profile pictures'}});
buf=Buffer.from(params.baseimage.replace(/^data:image\/\w+;base64,/,“”)、“base64”)
风险值数据={
键:params.fileName,
正文:buf,
ContentEncoding:'base64',
ContentType:“图像/jpeg”
};
const result=putObjectSync(数据);
//请注意,错误将抛出一个异常,这是您想要的,如下所示
//它们由Meteor处理,让称为的方法知道
//出了问题。
返回结果;
},
});

这是否回答了您的问题?@AnonCoward我已经使用了wait,但它给出了语法错误意外标记这是否回答了您的问题?@AnonCoward我已经使用了wait,但它给出了语法错误意外标记我已经使用了wait,但它给出了语法错误意外标记否不工作会产生错误:this.makeRequest不是函数
this.makeRequest
不出现在该代码中。你确定它没有被抛出到其他地方吗?@Christain我至少在代码中使用了this.makeRequest不工作会产生错误:this.makeRequest不是函数
this.makeRequest
不出现在该代码中。你呢你确定它没有被扔到其他地方吗?@Christain我至少在代码中使用了这个.makeRequest