第一次使用 hapi 和 mssql ,我正在努力从mssql查询获取数据到hapi响应。这是我的代码:
const Boom = require('boom');
const sql = require('mssql');
const dbConfig = require('../config/sql');
module.exports = [{
method: 'GET',
path: '/storeInfos',
handler: storeInfos
}
];
function storeInfos(request, h) {
sql.connect(dbConfig).then(() => {
const req = new sql.Request();
req.query('select id, name from StoreInfo').then((data) => {
return h.response(data);
})
.catch((err) => {
reply(Boom.badRequest(err.message, err));
});
})
.catch((err) => {
reply(Boom.badRequest(err.message, err));
});
}
执行/ storeInfos函数时,返回以下错误 “错误:storeInfos方法未返回值,承诺或引发错误。”
我尝试遵循其他示例,但是没有运气,也找不到很好的教程。我真的很坚持这一点,我们将不胜感激一些帮助,并且还会提供一些指向一些不错的教程的链接。 预先感谢...
答案 0 :(得分:0)
弄清楚了它,并通过使用await / async使它能够工作,这要归功于How to return value from the promise function in h.reponse这个帖子。 这是工作代码
const Boom = require('boom');
const sql = require('mssql');
const dbConfig = require('../config/sql');
module.exports = [{
method: 'GET',
path: '/storeInfos',
handler: async function (request, h) {
return await storeInfos(request, h);
}
}
];
async function storeInfos(request, h) {
let pool;
try {
pool = await sql.connect(dbConfig)
let data = await pool.request()
.query('select Id, Name from StoreInfo')
if (!data || data.recordset.length == 0) {
throw Boom.notFound();
}
return h.response(data.recordset);
} catch (err) {
throw Boom.internal(err.message);
} finally {
if (pool) {
sql.close();
}
}
}
可能不是最优雅的解决方案,但它可行。 我读到,不必关闭池连接,但是如果不调用 sql.close(),则在第二次调用该函数时,会出现关于“全局连接已存在”的错误。