与mysql连接的hapi.js在浏览器上未显示该值

时间:2019-05-14 09:26:36

标签: javascript mysql node.js hapijs

我试图使用hapi.js从mysql获取一些数据列表。但是我遇到了这个错误

Error:  method did not return a value, a promise, or throw an error

但是我可以在控制台中看到这些数据。

  

[RowDataPacket {id:1,代码:'test',描述:'bla',格式:'12'},     RowDataPacket {id:2,代码:“ test2”,描述:“ test”,格式:“ 15”}]

这是我的处理程序代码:

exports.getInfo = async (request, h) => {
    try {
            pool.query(`SELECT * FROM test`, (err, result) => {
            if (err) throw err;
            console.log(result);
            return h.response(result);    
        });

    } catch (e) {
        if (e.response) {
            switch (e.response.status) {
                case 404: return Boom.notFound();
                default: return Boom.failedDependency();
            }
        } else {
            return Boom.failedDependency();
        }
    }
};

这是承诺的问题,我想mysql没有返回任何承诺。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您已经在使用异步运算符,这意味着您可以在代码中使用异步/等待方法。

我假设您的pool.query方法正在返回一个promise,所以您的代码可能像这样。

exports.getInfo = async (request, h) => {
    try {
        const result = await pool.query(`SELECT * FROM test`);
        return result;
    } catch (e) {
        if (e.response) {
            switch (e.response.status) {
                case 404:
                    return Boom.notFound();
                default:
                    return Boom.failedDependency();
            }
        } else {
            return Boom.failedDependency();
        }
    }
};

如果没有,则可以将pool.query方法转换为Promise。

const QueryResult = (query) => {
    return new Promise((resolve, reject) => {
        pool.query(`SELECT * FROM test`, (err, result) => {
            if (err) return reject(err);           
            return resolve(result)
        });
    })
}

exports.getInfo = async (request, h) => {
    try {
        const result = await QueryResult(`SELECT * FROM test`);
        return result;   
    } catch (e) {
        if (e.response) {
            switch (e.response.status) {
                case 404:
                    return Boom.notFound();
                default:
                    return Boom.failedDependency();
            }
        } else {
            return Boom.failedDependency();
        }
    }
};