Javascript 承诺将未定义的结果返回回调

Javascript 承诺将未定义的结果返回回调,javascript,node.js,promise,mariadb,Javascript,Node.js,Promise,Mariadb,我在获取回调函数的结果时遇到问题。下面是我正在调用的异步函数 const utils = { sendQuery: async function(query){ // Receives a query and returns raw results // Query is using default database specified by pool // Returns a Promise let conn;

我在获取回调函数的结果时遇到问题。下面是我正在调用的异步函数

const utils = {
sendQuery: async function(query){
        // Receives a query and returns raw results
        // Query is using default database specified by pool
        // Returns a Promise 
        let conn;
        try {
            conn = await pool.getConnection();
            let queryString = query;
            let rows = await conn.query(queryString);
            let results = (this.formatResults(rows));
            console.log(results);
            return results;
        } catch(err) {
            throw new Error(err);
        } finally {
            if (conn) return conn.end();
        }
}

module.exports = {
       'utils': utils
}
上面的控制台日志返回预期结果

下面是调用上述函数的函数

const db = require('../private/db');

    db.utils.sendQuery(queryString).then(function(result){
        console.log(result);
    }).catch(err=>{
        throw res.render('error', {'error': err.stack});
    })

上面的控制台日志返回未定义,我不知道原因。

在我看来,只返回
结果
,而不是
解析(结果)
。您的函数已经是异步的,这里没有创建承诺对象。 只需抛出
err
,而不是
reject(err)


由于您返回的是
try
,因此不需要您的
finally
语句。

您只需返回结果,而不需要调用resolve

const-utils={
sendQuery:异步函数(查询){
//接收查询并返回原始结果
//查询正在使用池指定的默认数据库
//回报承诺
让康涅狄格州;
试一试{
conn=wait pool.getConnection();
让queryString=query;
让rows=wait conn.query(queryString);
让results=(this.formatResults(rows));
控制台日志(结果);
返回结果;
}捕捉(错误){
抛出新错误(err)
}最后{
如果(连接)返回连接端();
}
}
module.exports={
“utils”:utils
}

您可以直接返回,或者我想这就是您要做的

sendQuery: (query) => {
    let promise = new Promise(async (resolve, reject) => {
        let conn;
        try {
            conn = await pool.getConnection();
            let queryString = query;
            let rows = await conn.query(queryString);
            let results = (this.formatResults(rows));
            console.log(results);
            resolve(results);
        } catch (err) {
            reject(err);
        } finally {
            if (conn) {
                conn.end();
            }
        }
    })
    return promise;
}

这里真正的问题是这部分
如果(conn)返回conn.end();

无论何时使用
finally
,它都将覆盖在所述
try
catch
块中发生的任何先前
返回
中断
继续
抛出

要解决您的问题,您应该这样做:

const utils = {
sendQuery: async function(query){
        // Receives a query and returns raw results
        // Query is using default database specified by pool
        // Returns a Promise 
        let conn;
        try {
            conn = await pool.getConnection();
            let queryString = query;
            let rows = await conn.query(queryString);
            let results = (this.formatResults(rows));
            console.log(results);
            return results;
        } catch(err) {
            throw new Error(err);
        } finally {
            if (conn) conn.end();
        }
}

module.exports = {
       'utils': utils
}

希望它能工作

您好,谢谢您的回复。它仍然不工作。我尝试在try语句内外抛出错误,只是为了测试catch是否会被调用,它是否能工作。您得到结果了吗?只需尝试
抛出错误(err)
奇怪的是,当我在wait之后添加抛出错误时,它似乎没有抛出错误,并在调用它的函数上运行then。呜?????啊,错过了!你需要从
finally
块中删除return。正如上面的回答所述。哦,哇,这很有效!谢谢。我今天学到了一些新的东西。这部分代码我从mariadb驱动程序nodejs文档中获取。