我正在使用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时一定存在问题。
答案 0 :(得分:2)
两个问题:
在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);
});
});
}