Claudiajs和PG-Pool:如何包裹承诺



我使用claudiajs部署无服务器API(Lambda API网关)。在我的API中,我使用PG-Pool访问RDS Postgr。

我做了什么:

在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也没有显示任何错误。我用谷歌搜索了它,人们说它没有被承诺包裹。我的问题是如何将PG-POOL包裹在这种情况下。

任何建议都将受到赞赏。谢谢

****更新****

我试图在池中使用诺言

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收到错误:

毫无疑问的提示:未经治疗的承诺拒绝(拒绝ID:1):错误:由于连接超时而导致连接终止

看起来您可以从 pool.query获得诺言:

pg-pool支持一个完全有望的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);
});

您需要返回承诺。所以:

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
  })
})

感谢您到目前为止的答复。在周末播放了代码并谷歌搜索后,我找到了处理它的方法,我将解决方案留在此处供其他解决方案。

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();
  });
});

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

相关内容

  • 没有找到相关文章

最新更新