在 hapi 17 中捕获插件问题

Catching plugin issues in hapi 17

我正在使用 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 =',[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 = ',[123]);
    console.log(rows);
    if (!rows) {
        return Boom.badRequest('error');
    }
    return 'OK';

}

这是因为您的 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 =',[123]);

            if (!rows) {
                return Boom.badRequest('error');
            }

            return rows

        } catch (e) {
            return Boom.badRequest(e.message, e);
        }
    }
};