使用promise将一个NodeJS module.export函数的结果传递给另一个NodeJS module.export函数

时间:2019-03-05 20:38:52

标签: node.js promise

我正在使用Core和CoreTest作为两个功能来处理一些现有的NodeJS代码。 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 个答案:

答案 0 :(得分:2)

两个问题:

  • CoreTest中,您同时呼叫returnDataresolve。挂断直接的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()同步返回一个值。它做不到,它返回一个承诺。您将需要使用thenawait将其余代码链接到该代码。另外,您还应将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);
            });
        });
    }