Я использую 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)
Однако мой код просто перенаправляется прямо на "ок ", 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';
}