我试图在NodeJs 4.3中的Lambda函数中使用Promises而不是Callback。我要做的是从S3读取配置文件并使用配置连接到DB并在表上执行SELECT语句。当我测试该功能时,我在控制台中没有出现任何错误。
我已将我的功能定义如下:
function setUpConnection(response) {
console.log("S3 Response " + JSON.stringify(response));
return new Promise(function(resolve, reject) {
config = response.Body.toString('utf-8');
config = JSON.parse( config );
// set up connection from S3 config file
var con = mysql.createConnection({
host: config.hostaddress,
user: config.user,
password: config.pass,
database: config.dbname
});
console.log("connection " + JSON.stringify(con));
console.log("config " + JSON.stringify(config));
// create connection
con.connect(function(err){
if(err){
// Output connection details for debugging
console.log('Error connecting to DB');
return Promise.reject(new Error(output));
}
});
// Run Select Query
con.query("SELECT * FROM goodsreceiptheader WHERE invoiceKey = ?", [invoicekey], function(err,res){
if(err){
console.log(err);
con.end();
return Promise.reject(new Error(output));
}
if ( res.length <= 0 ){
console.log('Response Object ' + JSON.stringify(res));
con.end();
return Promise.reject(new Error(output));
}
resolve(res);
})
})
}
此功能正在调用该函数:
// Setup goodsreceipt info
var goodsreceipt = data.goodsreceipt;
getObjectPromise = s3bucket.getObject(params).promise()
getObjectPromise
.then(setUpConnection)
.then(validateRecord)
.catch(callback(null, Error))
当我执行此代码时,我只看到代码的结果
console.log("S3 Response " + JSON.stringify(response));
在第二行。我配置setUpConnection的方式有问题吗?
答案 0 :(得分:0)
你以错误的方式使用拒绝。
return Promise.reject(new Error(output));
应替换为
reject(new Error(output));
return;
同样捕捉看起来很奇怪:它立即调用回调。通常catch块看起来像这样:
somePromise.catch((error) => {
console.error(error); // If output required.
callback(error); // If callback provided.
});
在con.connect回调中移动con.query调用。
答案 1 :(得分:0)
首先,输出来自哪里?我没有看到任何定义。
其次,始终使用Error
的实例抛出/拒绝被认为是一种好习惯,在您的示例中我猜,至少通过变量名称,output
不是Error
的实例}。第三件事一般情况下,在我看来使用new Promise
构造函数时,只有有效的用例是当你想要将回调api转换为你在这里做的承诺(这是好的)或你在处理setTimeout/setInterval
时/ p>
无论如何,您使用的Promise.reject
已经在范围内reject
,在这种情况下您不应该拒绝承诺。接下来就是你在con.query
提供的回调之外使用con.connect
,这实际上意味着你在成功建立连接之前调用了query
,尝试使用类似的东西:
return new Promise(function(resolve, reject) {
...
con.connect(function(err){
if(err){
return reject(new Error('...'));
}
// Run Select Query
con.query(..., ..., function (err,res) {
if(err){
...
return reject(new Error('...'));
}
if (res.length <= 0 ){
...
return reject(new Error(output));
}
return resolve(res);
})
});
})
很少有人注意到:
1.检查这个lib是否有承诺api,可能它应该以这种方式你不需要自己宣传这些东西。
2.如果它没有,你总是可以使用像bluebird
这样的库来为你提供代码
答案 2 :(得分:0)
你拒绝承诺是错误的
尝试这种方式
function setUpConnection(response) {
console.log("S3 Response " + JSON.stringify(response));
return new Promise(function(resolve, reject) {
config = response.Body.toString('utf-8');
config = JSON.parse( config );
// set up connection from S3 config file
var con = mysql.createConnection({
host: config.hostaddress,
user: config.user,
password: config.pass,
database: config.dbname
});
console.log("connection " + JSON.stringify(con));
console.log("config " + JSON.stringify(config));
// create connection
con.connect(function(err){
if(err){
// Output connection details for debugging
console.log('Error connecting to DB');
return reject(err);
}
});
// Run Select Query
con.query("SELECT * FROM goodsreceiptheader WHERE invoiceKey = ?", [invoicekey], function(err,res){
if(err){
console.log(err);
con.end();
return reject(err);
}
if ( res.length <= 0 ){
console.log('Response Object ' + JSON.stringify(res));
con.end();
return reject('response less 0');
}
resolve(res);
})
})
}