在 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);
}
}
};
我正在使用 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);
}
}
};