gpt4 book ai didi

amazon-s3 - 如何通过 Meteor Iron Router 从 S3 提供文件

转载 作者:行者123 更新时间:2023-12-01 12:43:06 25 4
gpt4 key购买 nike

我的问题与this one 非常相似其中描述了如何使用 Iron Router 提供本地文件。我需要做同样的事情,但不是从磁盘同步读取文件,而是需要从异步调用的 S3 获取文件。

问题似乎是 action 方法在异步 s3.getObject 完成之前返回,这给我以下错误。

错误:将 header 发送到客户端后无法呈现 header 。

当 Iron Router 意识到我没有在我的 action 方法中处理响应时,我假设 Iron Router 正在为我生成响应,但我不知道如何告诉它等待我的异步调用完成。

这是我的代码。

Router.map(function () {
this.route('resumeDownload', {
where: 'server',
path: '/resume/:_id',
action: function () {
var response = this.response;

var candidate = Candidates.findOne(this.params._id);
if (!candidate || !candidate.resumeS3Key) {
// this works fine because the method hasn't returned yet.
response.writeHead(404);
return response.end();
}

var s3 = new AWS.S3();
s3.getObject({Bucket: 'myBucket', Key: candidate.resumeS3Key}, function (err, data) {
if (err) {
// this will cause the error to be displayed
response.writeHead(500);
return response.end();
}
// this will also cause the error to be displayed
response.writeHead(200, {'Content-Type': data.ContentType});
response.end(data.Body);
});
}
});
});

最佳答案

我自己解决了这个问题。我需要在我的 action 方法中使用 future

这是工作代码。

Router.map(function () {
this.route('resumeDownload', {
where: 'server',
path: '/resume/:_id',
action: function () {
var response = this.response,
candidate = Candidates.findOne(this.params._id);

if (!candidate || !candidate.resumeS3Key) {
response.writeHead(404);
return response.end();
}

var Future = Npm.require('fibers/future'),
s3 = new AWS.S3(),
futureGetObject = Future.wrap(s3.getObject.bind(s3)),
data = futureGetObject({Bucket: 'myBucket', Key: candidate.resumeS3Key}).wait();

response.writeHead(200, {'Content-Type': data.ContentType});
response.end(data.Body);
}
});
});

关于amazon-s3 - 如何通过 Meteor Iron Router 从 S3 提供文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22515740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com