ClaudiaJS 和 pg-pool:如何包装在 promise 中
ClaudiaJS and pg-pool: how to wrap in promise
我使用 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)
});
}
什么问题:
它没有 return 任何东西,Cloudwatch 也没有显示任何错误。我用谷歌搜索了一下,人们说它没有包含在 Promise 中。我的问题是如何在这种情况下将 pg-pool 包装在 Promise 中。
如有任何建议,我们将不胜感激。谢谢
****更新****
我尝试使用 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: Unhandled promise rejection (rejection id: 1): Error: Connection terminiated due to connection timeout
看起来你可以从 pool.query
得到一个承诺:
pg-pool supports a fully promise-based api for acquiring clients
https://github.com/brianc/node-pg-pool#acquire-clients-with-a-promise
然后您可以将承诺链接到 return 您的 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承诺。所以:
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();
});
});
对我有用。无论如何,如果有人有更好的想法,也请在这里分享。
我使用 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)
});
}
什么问题: 它没有 return 任何东西,Cloudwatch 也没有显示任何错误。我用谷歌搜索了一下,人们说它没有包含在 Promise 中。我的问题是如何在这种情况下将 pg-pool 包装在 Promise 中。
如有任何建议,我们将不胜感激。谢谢
****更新****
我尝试使用 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: Unhandled promise rejection (rejection id: 1): Error: Connection terminiated due to connection timeout
看起来你可以从 pool.query
得到一个承诺:
pg-pool supports a fully promise-based api for acquiring clients
https://github.com/brianc/node-pg-pool#acquire-clients-with-a-promise
然后您可以将承诺链接到 return 您的 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承诺。所以:
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();
});
});
对我有用。无论如何,如果有人有更好的想法,也请在这里分享。