我正在使用hapi17,并围绕pg
(https://node-postgres.com用于访问Postgresql)构建一个简单的插件包装。
我怀疑我在这里犯了一个简单的Javascript Noob错误,但我不知道在哪里。
我的插件代码如下:
'use strict';
const {Pool} = require('pg');
exports.plugin = {
name: 'pgPlugin',
version: '0.0.1',
register: async function (server, options) {
const pgUser=server.configue.get('postgresql.username');
const pgPass=server.configue.get('postgresql.password');
const pgHost=server.configue.get('postgresql.host');
const pgPort=server.configue.get('postgresql.port');
const pgDb=server.configue.get('postgresql.database');
const pool = new Pool ({
user: pgUser,
password:pgPass,
database:pgDb,
host:pgHost,
port:pgPort
});
console.log('Postgresql setup complete');
pool.on('error', (err, client) => {
console.error('Unexpected error on idle client', err);
});
server.decorate('toolkit','doPostgresQuery',async (query,params) => {
try {
const {rows} = await pool.query(query,params);
return rows;
} catch (e) {
console.log('here');
console.log(e.stack);
return false;
}
});
}
};
例如,目前,我在配置中设置了错误的凭据,因此,pg
失败了,并将以下内容记录到控制台:
here
Error: connect ECONNREFUSED database.server:5342
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1113:14)
但是,我的代码一直直通“ ok”,Boom.badRequest
从未被称为:
const rows = h.doPostgresQuery('select foobar from foo where bar =$1',[123]);
console.log(rows);
if (!rows) {
return Boom.badRequest('error');
}
return 'OK';
我尝试重写const rows = await h.doPostgresQuery(...
,但这会产生错误:
SyntaxError: await is only valid in async function
这很奇怪,因为server.decorate
定义了一个异步函数?
更新
其他代码以供澄清:
路线:
exports.plugin = {
name: 'blahPlugin',
version: '0.0.1',
register: async function (server, options) {
server.route({
method: 'POST',
path: '/test',
handler: blahController.test,
options: {
validate: {
payload: blahValidator.smsValidator,
failAction: handleValidationError.errorHandler
}
}
});
}
};
控制器:
exports.test = (request, h) => {
const rows = await h.doPostgresQuery('select foobar from foo where bar = $1',[123]);
console.log(rows);
if (!rows) {
return Boom.badRequest('error');
}
return 'OK';
}
答案 0 :(得分:2)
这是因为您的doPostgresQuery返回了一个Promise,但您没有等待响应。
出现错误是因为您需要将处理程序声明为异步函数,然后可以在查询中使用await,或者需要使用h.doPostgresQuery.then((rows))
表示法。
以下是示例:
exports.myHandler = {
description: 'get something',
handler: async (request, h) => {
try {
const rows = await h.doPostgresQuery('select foobar from foo where bar =$1',[123]);
if (!rows) {
return Boom.badRequest('error');
}
return rows
} catch (e) {
return Boom.badRequest(e.message, e);
}
}
};