【问题标题】:ClaudiaJS and pg-pool: how to wrap in promiseClaudiaJS 和 pg-pool:如何包装承诺
【发布时间】:2017-10-04 16:43:26
【问题描述】:

我使用 ClaudiaJS 部署无服务器 API(Lambda + API 网关)。在我的 API 中,我使用 pg-pool 访问 RDS Postgres。

我做了什么:

在 app.js 中

var ApiBuilder = require('claudia-api-builder'),
api = new ApiBuilder();
module.exports = api;

var Pool = require('pg-pool');

api.get("/list", function (request) {
   var dbconnect = {
     user: ‘xxxx’, //env var: PGUSER
     database: ‘xxxx’, //env var: PGDATABASE
     password: ‘xxx’, //env var: PGPASSWORD
     host: ‘xxxxxxxxxx.eu-west-1.rds.amazonaws.com', // Server hosting the postgres database
     port: 5432, //env var: PGPORT
     max: 1,
     min: 0,
     idleTimeoutMillis: 300000, 
     connectionTimeoutMillis: 1000
};

var pool = new Pool(dbconnect)
var sql = ‘Select …’

pool.query(sql, function (err, result) {

    console.log('Lambda :: execute query ');

    var resp = new Object();
    var jsonArr = []; // Populate the result
    console.log('Lambda :: result :: ' + JSON.stringify(result));
    return JSON.stringify(result)
});
}

什么问题: 它不返回任何内容,Cloudwatch 也不显示任何错误。我用谷歌搜索了它,人们说它没有包含在 Promise 中。我的问题是如何在这种情况下将 pg-pool 包装在 Promise 中。

感谢任何建议。谢谢

****更新****

我尝试在池中使用承诺

pool.connect().then(client => {
  client.query(sql).then(res => {
    client.release()
    console.log('Result:', res.rows[0])
    return JSON.stringify(res.rows[0]);
  })
  .catch(e => {
    client.release()
    console.error('query error', e.message, e.stack)
  })
})

我从 CloudWatch 收到错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):错误:连接因连接超时而终止

【问题讨论】:

  • 你的 Lambda handler 是什么样的?你能发布你如何从你的处理程序调用这个代码吗?
  • 既然pg-promise 已经完成了所有工作,为什么还要将Pool 包装在promise 中? ;)

标签: node.js aws-lambda node-postgres claudiajs


【解决方案1】:

看起来你可以从pool.query得到一个承诺:

pg-pool 支持完全基于 Promise 的 api 来获取客户

https://github.com/brianc/node-pg-pool#acquire-clients-with-a-promise

然后您可以链接承诺以返回您的 JSON:

return pool.query(sql).then(function (result) {

    console.log('Lambda :: execute query ');

    var resp = new Object();
    var jsonArr = []; // Populate the result
    console.log('Lambda :: result :: ' + JSON.stringify(result));
    return JSON.stringify(result)
}, function(error){
    //handle error here
    console.error(error);
});

【讨论】:

  • 您好,感谢您的快速回复。我尝试了您的建议并收到错误: UnhandledPromiseRejectionWarning: Unhandled Promise reject (rejection id: 1): Error: Connection terminated due to connection timeout
  • 嗨@PeterPham,没问题。我更新了我对承诺拒绝的回答。
  • 是的,没有更多的承诺拒绝警告,但仍然错误:“连接因连接超时而终止”。似乎池无法建立连接。任何想法?此池在 AWS Elastic BeanTalk 中正常工作
  • 看起来您无法连接...我觉得这是一个不同的问题。请尝试在谷歌上搜索该特定错误,我不知道您的连接细节。
【解决方案2】:

您需要返回承诺。所以:

return pool.connect().then(client => { // Return a promise
  return client.query(sql).then(res => { // Return promise again, if you omit this it will break promise chain
    client.release()
    console.log('Result:', res.rows[0])
    return JSON.stringify(res.rows[0]);
  })
  .catch(e => {
    client.release()
    console.error('query error', e.message, e.stack)
    throw e // Throw an error so Claudia can catch it
  })
})

【讨论】:

  • 事实上,您的答案与我找到的解决方案非常接近。 :)
  • 破坏承诺链是人们使用 Claudia API Builder 和 Claudia Bot Builder 时最常见的错误之一。我们需要尽快写一篇关于那个的文章:)这段代码只是一个例子,它可能需要稍微不同。
【解决方案3】:

感谢您到目前为止的回复。在周末玩了代码和谷歌搜索之后,我找到了处理它的方法,我把解决方案留在这里,如果有的话。

var ApiBuilder = require('claudia-api-builder');
var pgp = require('pg-promise')();

api = new ApiBuilder();
module.exports = api;

api.get('/list', function (request) {

   var dbconnect = {
      user: ‘xxx’, //env var: PGUSER
      database: ‘xxx’, //env var: PGDATABASE
      password: ‘xxx’, //env var: PGPASSWORD
      host: ‘xxxx.rds.amazonaws.com', // Server hosting the postgres database
      port: 5432, //env var: PGPORT
   };

   var db = pgp(dbconnect);

   var sql = "SELECT * from table ...“;

   return db.any(sql).then(function (data) {

      pgp.end();

      console.log('Lambda :: params :: ' + JSON.stringtify(data));

      var resp = {
         name: data[0].name,
         serial_number: data[0].serial
      };

     return resp;
  })
   .catch(function (error) {
      console.log("Lambda :: Error: " + error);
      pgp.end();
  });
});

它对我有用。无论如何,如果有人有更好的想法,也请在这里分享。

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 2017-06-18
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2020-07-04
    • 1970-01-01
    • 2017-01-16
    相关资源
    最近更新 更多