Устранение проблем с плагинами в хапи 17 - PullRequest
0 голосов
/ 12 декабря 2018

Я использую 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';

}

1 Ответ

0 голосов
/ 13 декабря 2018

Это потому, что ваш doPostgresQuery возвращает обещание, но вы не ожидаете ответа.

Произошла ошибка, потому что вам нужно объявить ваш обработчик как асинхронную функцию, тогда вы можете использовать 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);
        }
    }
};
...