我无法履行这一承诺

时间:2016-10-21 10:57:45

标签: node.js

我试图在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的方式有问题吗?

3 个答案:

答案 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);
    })
})
}