首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClaudiaJS和pg-池:如何包装承诺

ClaudiaJS和pg-池:如何包装承诺
EN

Stack Overflow用户
提问于 2017-09-27 16:19:16
回答 3查看 372关注 0票数 1

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

我所做的:

在app.js中

代码语言:javascript
复制
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-池包装成这个案子的希望。

如有任何建议,将不胜感激。谢谢

*更新*

我试着在泳池里用这个承诺

代码语言:javascript
复制
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):错误:由于连接超时而终止的连接

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-04 08:43:26

谢谢你到目前为止的答复。在浏览了代码并在周末进行googling搜索之后,我找到了处理它的方法,我把解决方案留在这里,如果有的话。

代码语言:javascript
复制
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();
  });
});

对我来说很管用。无论如何,如果有人有更好的想法,请在这里分享。

票数 0
EN

Stack Overflow用户

发布于 2017-09-27 16:25:19

看来你可以从pool.query那里得到一个承诺

pg池支持完全基于承诺的api来获取客户端。

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

然后,您可以连锁承诺返回您的JSON:

代码语言:javascript
复制
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);
});
票数 0
EN

Stack Overflow用户

发布于 2017-10-02 14:12:28

你得把承诺还给我。所以:

代码语言:javascript
复制
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
  })
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46452737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档