英文:
nodejs problem sending the variable value to show controller
问题
-- model--
class GloParameter {
static findGlo(gloFunction, gloCode, gloValue, cb) {
db.query(findGloParameterFCVActiveQuery, gloFunction, gloCode, gloValue, (err, res) => {
if (err) {
logger.error(err.message);
cb(err, null);
return;
}
if (res.length) {
cb(null, res[0]);
return;
}
cb({ kind: "not_found" }, null);
})
}
}
module.exports = GloParameter;
-- controller--
exports.serviceX = (req, res) => {
const xx1 = GloParameter.findGlo(['withdraw_money_time', 'withdraw_money_time', 'start'], (err, data) => {
console.log('xxxxxxx', data[0].glo_info1)
return data[0].glo_info1
})
res.status(200).send({
status: 'success',
data: xx1
});
return
}
-- db --
const findGloParameterFCVActive = `
SELECT * FROM glo_parameter WHERE glo_function = ? AND glo_code = ? AND glo_value = ? AND glo_status = 'active'
`
module.exports = {
findGloParameterFCVActive
};
Call Api
response API is parameter data : .....
Troubleshooting the display of results
英文:
nodejs problem sending the variable value to show controller
-- model--
class GloParameter {
static findGlo(gloFunction, gloCode, gloValue, cb) {
db.query(findGloParameterFCVActiveQuery, gloFunction, gloCode, gloValue, (err, res) => {
if (err) {
logger.error(err.message);
cb(err, null);
return;
}
if (res.length) {
cb(null, res[0]);
return;
}
cb({ kind: "not_found" }, null);
})
}
}
module.exports = GloParameter;
-- controller--
exports.serviceX = (req, res) => {
const xx1 = GloParameter.findGlo(['withdraw_money_time', 'withdraw_money_time', 'start'], (err, data) => {
console.log('xxxxxxx', data[0].glo_info1)
return data[0].glo_info1
})
res.status(200).send({
status: 'success',
data: xx1
});
return
}
-- db --
const findGloParameterFCVActive = `
SELECT * FROM glo_parameter WHERE glo_function = ? AND glo_code = ? AND glo_value = ? AND glo_status = 'active'
`
module.exports = {
findGloParameterFCVActive
};
Call Api
response API is parameter data : .....
Troubleshooting the display of results
答案1
得分: 0
问题在于你正在尝试从异步回调函数中返回一个值,而在Node.js中这是不可能的。回调函数在声明它的函数返回后的某个时间执行,所以回调函数无法返回到任何地方。
为了解决这个问题,你需要采用一种不同的方法,比如使用 promises 或者 async/await 语法。
例如:
/* 模型 */
const { query, findGloParameterFCVActive } = require("./db");
const util = require("util");
const queryAsync = util.promisify(query);
class GloParameter {
static async findGlo(gloFunction, gloCode, gloValue) {
try {
const data = await queryAsync(findGloParameterFCVActiveQuery, [
gloFunction,
gloCode,
gloValue,
]);
if (!data.length) {
throw { kind: "not_found" };
}
return data;
} catch (err) {
logger.error(err.message);
throw err;
}
}
}
module.exports = GloParameter;
/* 控制器 */
exports.serviceX = async (req, res) => {
try {
const data = await GloParameter.findGlo(
"withdraw_money_time",
"withdraw_money_time",
"start",
);
const xx1 = data[0].glo_info1;
console.log("xxxxxxx", xx1);
res.status(200).send({
status: "success",
data: xx1,
});
} catch (error) {
console.error(error);
res.status(500).send({
status: "error",
message: error.message,
});
}
}
然后,我认为问题在于你的 db.query 函数没有返回一个 promise,而是将回调函数作为最后一个参数。因此,你无法在其上使用 await,因为 await 只能用于 promises。
要解决这个问题,你需要将你的 db.query 函数包装在一个 promise 中,并在回调函数内部解析或拒绝它。例如:
/* db 文件 */
const query = (sql, ...params) => {
return new Promise((resolve, reject) => {
db.query(sql, ...params, (err, res) => {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
const findGloParameterFCVActive = `
SELECT * FROM glo_parameter WHERE glo_function = ? AND glo_code = ? AND glo_value = ? AND glo_status = 'active'
`;
module.exports = {
query,
findGloParameterFCVActive,
};
英文:
The problem is that you are trying to return a value from an asynchronous callback function, which is not possible in Node.js. The callback function is executed some time after the function in which it was declared has returned, so there is nowhere for the callback function to return to.
To solve this problem, you need to use a different approach, such as using promises or async/await syntax.
For example:
/* MODEL */
const { query, findGloParameterFCVActive } = require("./db");
const util = require("util");
const queryAsync = util.promisify(query);
class GloParameter {
static async findGlo(gloFunction, gloCode, gloValue) {
try {
const data = await queryAsync(findGloParameterFCVActiveQuery, [
gloFunction,
gloCode,
gloValue,
]);
if (!data.length) {
throw { kind: "not_found" };
}
return data;
} catch (err) {
logger.error(err.message);
throw err;
}
}
}
module.exports = GloParameter;
/* CONTROLLER */
exports.serviceX = async (req, res) => {
try {
const data = await GloParameter.findGlo(
"withdraw_money_time",
"withdraw_money_time",
"start",
);
const xx1 = data[0].glo_info1;
console.log("xxxxxxx", xx1);
res.status(200).send({
status: "success",
data: xx1,
});
} catch (error) {
console.error(error);
res.status(500).send({
status: "error",
message: error.message,
});
}
}
Then, I think the problem is that your db.query function does not return a promise, but takes a callback function as the last argument. Therefore, you cannot use await with it, because await only works with promises.
To fix this problem, you need to either wrap your db.query function in a promise and resolve or reject it inside the callback function. For example:
/* db File */
const query = (sql, ...params) => {
return new Promise((resolve, reject) => {
db.query(sql, ...params, (err, res) => {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
const findGloParameterFCVActive = `
SELECT * FROM glo_parameter WHERE glo_function = ? AND glo_code = ? AND glo_value = ? AND glo_status = 'active'
`;
module.exports = {
query,
findGloParameterFCVActive,
};
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论