如何强制节点等待 aws 承诺解决?
How do I force node to wait for aws promise to resolve?
正在尝试从 node.js Express 应用程序访问 S3 存储桶。我正在尝试以 JSON 对象的形式从存储桶中 return JSON 文件。这是代码:
let gets3 = function(file) {
devs3();
return new Promise(function(resolve, reject) {
var params = {
Bucket: S3_BUCKET,
Key: file
}
var s3 = new aws.S3();
try {
s3.getObject(params, function(err, data) {
var myfile = JSON.parse(data.Body.toString());
resolve(myfile);
});
} catch (err) {
reject(err);
}
});
}
module.exports = {
fetchEvents : function(cata) {
var myJson;
switch (cata) {
case "Pr":
myJson = 'primaryEvents.json';
case "Sc":
myJson = 'secondaryEvents.json';
case "Po":
myJson = 'postEvents.json';
}
let gets3init = gets3(myJson);
gets3init.then(function(file) {
console.log('From Fetch Events: ' + JSON.stringify(file));
return file;
});
}
}
devs3() 只是设置 S3 登录信息和 运行s aws.config.setPromisesDependancy。在我的主要 app.js 中,我 运行 fetchEvents("Pr") 然后尝试显示它。在我的控制台中,它成功显示了 json 文件的内容,但是应用程序存在类型错误:cannot read property 'n' of undefined
,其中 n 是 Json 文件中第一个元素的名称.需要注意的一件事是,此错误显示在控制台 before 打印 JSON 文件,从而表明函数没有等待 gets3 完成和 return 文件。无论如何强制应用程序等待(这发生在页面加载时)承诺解决?
感谢@Bergi 为我指明了正确的方向并帮助我得到了这个答案。本质上,我从一开始就错误地使用了 promises。我需要 return 来自 fetchEvents
函数的承诺,而不是数据,然后在调用代码中使用它,以便仅在承诺得到解决后才继续。
fetchEvents
module.exports = {
fetchEvents : function(cata) {
var myJson;
switch (cata) {
case "Pr":
myJson = 'primaryEvents.json';
break;
case "Sc":
myJson = 'secondaryEvents.json';
break;
case "Po":
myJson = 'postEvents.json';
break;
}
return gets3(myJson);
}
}
调用代码
app.get('/PrEvents', function(req, res) {
var myCata = req.path.replace('Events', '').replace('/', '');
fetch(myCata).then(function(events) {
res.render('pages/eventsShowTemp', {
console.log(events);
});
});
});
正在尝试从 node.js Express 应用程序访问 S3 存储桶。我正在尝试以 JSON 对象的形式从存储桶中 return JSON 文件。这是代码:
let gets3 = function(file) {
devs3();
return new Promise(function(resolve, reject) {
var params = {
Bucket: S3_BUCKET,
Key: file
}
var s3 = new aws.S3();
try {
s3.getObject(params, function(err, data) {
var myfile = JSON.parse(data.Body.toString());
resolve(myfile);
});
} catch (err) {
reject(err);
}
});
}
module.exports = {
fetchEvents : function(cata) {
var myJson;
switch (cata) {
case "Pr":
myJson = 'primaryEvents.json';
case "Sc":
myJson = 'secondaryEvents.json';
case "Po":
myJson = 'postEvents.json';
}
let gets3init = gets3(myJson);
gets3init.then(function(file) {
console.log('From Fetch Events: ' + JSON.stringify(file));
return file;
});
}
}
devs3() 只是设置 S3 登录信息和 运行s aws.config.setPromisesDependancy。在我的主要 app.js 中,我 运行 fetchEvents("Pr") 然后尝试显示它。在我的控制台中,它成功显示了 json 文件的内容,但是应用程序存在类型错误:cannot read property 'n' of undefined
,其中 n 是 Json 文件中第一个元素的名称.需要注意的一件事是,此错误显示在控制台 before 打印 JSON 文件,从而表明函数没有等待 gets3 完成和 return 文件。无论如何强制应用程序等待(这发生在页面加载时)承诺解决?
感谢@Bergi 为我指明了正确的方向并帮助我得到了这个答案。本质上,我从一开始就错误地使用了 promises。我需要 return 来自 fetchEvents
函数的承诺,而不是数据,然后在调用代码中使用它,以便仅在承诺得到解决后才继续。
fetchEvents
module.exports = {
fetchEvents : function(cata) {
var myJson;
switch (cata) {
case "Pr":
myJson = 'primaryEvents.json';
break;
case "Sc":
myJson = 'secondaryEvents.json';
break;
case "Po":
myJson = 'postEvents.json';
break;
}
return gets3(myJson);
}
}
调用代码
app.get('/PrEvents', function(req, res) {
var myCata = req.path.replace('Events', '').replace('/', '');
fetch(myCata).then(function(events) {
res.render('pages/eventsShowTemp', {
console.log(events);
});
});
});