在HAPI 17中捕获插件问题

时间:2018-12-12 19:02:04

标签: node.js hapijs

我正在使用hapi17,并围绕pghttps://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';

}

1 个答案:

答案 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);
        }
    }
};