source

정의되지 않은 결과를 콜백으로 반환할 것을 약속합니다.

factcode 2023. 10. 11. 21:03
반응형

정의되지 않은 결과를 콜백으로 반환할 것을 약속합니다.

콜백 기능의 결과를 얻는 데 문제가 있습니다.아래는 제가 전화하는 비동기 기능입니다.

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

위의 콘솔 로그는 정의되지 않은 상태로 반환되며 그 이유를 알 수 없습니다.

여기서 진짜 문제는 이 부분입니다.if (conn) return conn.end();.

사용할 때마다finally, 이전의 모든 것을 덮어쓸 것입니다.return,break,continue아니면throw다음과 같은 경우에 발생합니다.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
}

잘 됐으면 좋겠네요.

제 생각에는 그냥 돌아오세요.results대신에resolve(results). 함수가 이미 비동기 상태이며 여기에 약속 개체가 생성되지 않았습니다.그리고 그냥 던져요.err대신에reject(err);

그리고 당신이 당신의 집으로 돌아온 이후로try, 당신의 것은 필요 없습니다.finally진술.

해결을 호출하는 대신 결과를 반환하기만 하면 됩니다.

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
}

당신은 그냥 돌아올 수도 있고, 아니면 이것이 당신이 하려고 했던 것이라고 생각합니다.

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;
}

언급URL : https://stackoverflow.com/questions/60344335/promise-returning-undefined-result-to-callback

반응형