Использование обещания для передачи результатов одной функции NodeJS module.export в другую функцию NodeJS module.export - PullRequest
1 голос
/ 05 марта 2019

Я работаю над некоторым существующим кодом NodeJS с Core и CoreTest в качестве двух функций. CoreTest выполняет запрос и сохраняет выбранные строки в переменной с именем CoreSQL. Core также выполняет некоторые запросы, однако для одного из запросов требуется часть CoreSQL.

Я думаю, что неправильно вызываю CoreTest

module.exports = {

    CoreTest: (req, res) => {
        return new Promise((resolve, reject) => {
            const core = db.format.escape(req.query.q);
            const coreSQL = `query with parameter = ${core}`;
            returnData(coreSQL, resolve, reject);
            resolve(coreSQL);
        })
    },

    Core: (req, res) => {
        return new Promise((resolve, reject) => {
            if (req.query.q.length > 0) {
                var core = module.exports.CoreTest(req, res);
            }
            else
            {
                reject("PROBLEMS")
            }
            const coreSQLceDevID = `query where parameter like ${core}`
            const coreSQLpID = `query where parameter like ${coreSQLceDevID})`
            const coreSQL = `query where parameter like ${coreSQLpID}`
            returnDataB(coreSQL, resolve, reject);
        })
    } 
}

Функции возврата данных запускают запрос SQL и выглядят следующим образом:

const returnData = (sql, resolve, reject) => {
    db.query(sql, (err, result) => {
        if (err)
            reject(err)
        else
            resolve(result)
    })
}

Я получаю следующую ошибку:

error: Unhandled rejection!
Reason:TypeError: Cannot read property 'q' of undefined,
Promise: [object Promise]

Хотя, когда я использую контрольные точки для проверки значения q, оно не является неопределенным, поэтому должно возникнуть проблема с вызовом CoreTest.

1 Ответ

2 голосов
/ 05 марта 2019

Две проблемы:

  • в CoreTest, вы звоните как returnData, так и resolve.Отбросьте немедленный вызов resolve(), returnData сделает это позже.(Кстати, я бы рекомендовал переименовать его в runQuery или около того).

    CoreTest(req, res) {
        return new Promise((resolve, reject) => {
            const core = db.format.escape(req.query.q);
            const coreSQL = `query with parameter = ${core}`;
            returnData(coreSQL, resolve, reject);
        })
    }
    
  • в Core, вы, вероятно, ожидаете, что CoreTest() будет возвращать значение синхронно.Это не может сделать это, это возвращает обещание.Вам нужно будет связать оставшуюся часть кода с кодом then или await.Также вы должны держать new Promise упаковщик минимальным:

    Core(req, res) {
        if (req.query.q.length == 0) {
            return Promise.reject("PROBLEMS");
        }
        return module.exports.CoreTest(req, res).then(core => {
    //                                          ^^^^^
            return new Promise((resolve, reject) => {
                const coreSQLceDevID = `query where parameter like ${core}`
                const coreSQLpID = `query where parameter like ${coreSQLceDevID})`
                const coreSQL = `query where parameter like ${coreSQLpID}`
                returnDataB(coreSQL, resolve, reject);
            });
        });
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...