【发布时间】:2016-03-09 02:21:40
【问题描述】:
美好的一天。 一直在想办法解决这个问题。
简而言之,我有一个表单,其中包含多个文本输入以及一个输入文件元素,用于将所述文件上传到 AWS S3(通过 lepozepo:s3 ver5.1.4 包)。这个包的好处是它不需要服务器,因此可以检查资源。
这个 S3 包将文件上传到我配置的存储桶并返回 URL 以访问其他几个数据点中的图像。
那么,回到表格。我需要将返回的 AWS URL 与其他表单数据一起放入数据库。但是,由于 S3 调用是异步的,因此 S3 调用比应用程序等待的时间要长,因此我发给 Meteor.call() 的帖子中的字段未定义只是因为它没有等待足够长的时间来获取 AWS URL。
我可以通过将 Meteor.call() 直接放入 S3 调用的回调中来解决这个问题。但是,我希望避免这种情况,因为我更希望 S3 上传是它自己的模块或辅助函数,甚至是任何辅助函数之外的函数,因为它可以在应用程序的其他区域重复使用以进行文件上传。
伪代码:
Template.contacts.events({
'submit #updateContact': function(e,template){
s3.upload({file:inputFile, path:client},function(error,result){
if(error){
// throw error
}else{
var uploadInfo = result;
}
});
formInfo = {name:$('[name=name]').val(),file:uploadInfo}; // <= file is undefined because S3 hasn't finished yet
Meteor.call('serverMethod',formInfo, function(e,r){
if(e){
// throw error message
}else{
// show success message
}
});
});
我可以将 formInfo 和 Meteor.call() 放在 s3 回调中,但这会导致更复杂的代码和更少的代码重用,而 IMO 这是代码重用的理想场所。
我尝试将 s3 包装在它自己的函数中,无论是否有回调。我试过使用reactiveVars。我认为再次使用 s3 文件信息更新 db 会使 s3 抽象更加复杂,因为它需要知道 _id 等...
有什么想法吗? 谢谢。
【问题讨论】:
标签: javascript meteor amazon-s3