所以我在node.js中编写了这个MySQL select代码。我对js和回调函数都很陌生,如何从全局范围内的回调中获取var uId
?
我试图这样做是因为我的函数mysqlselect必须返回uId。
function mysqlselect(db, data) {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) throw err;
let uId = result[0].id;
});
// I want to be able to return uId here
};
答案 0 :(得分:1)
你不能,因为db.query
是异步的。
但是,您可以返回Promise
,如下所示:
function mysqlselect(db, data) {
return new Promise((resolve, reject) => {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) reject(err);
let uId = result[0].id;
resolve(uId);
});
});
};
然后您可以这样使用:
mysqlselect(db, data).then((id) => console.log(id));
答案 1 :(得分:0)
试试这个:
function mysqlselect(db, data, callback) {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) callback(err, null);
let uId = result[0].id;
callback(null, uId);
});
};
然后你可以这样称呼它:
mysqlselect(db, data, function (err, uId) {
if (err) throw err;
console.log(uId)
});
答案 2 :(得分:0)
对数据库的所有查询或对Javascript中的端点等的请求都是异步进程,这意味着它们不会在通常的执行过程中执行。而是在您的情况下执行进程时,当在数据库上执行查询并返回repsonse时,将调用这些回调
现在,您可以使用多种方法处理此方案中的变量,但由于您希望在数据库查询后立即访问变量,因此可以尝试以下方法。
// YOU CAN USE AWAIT ONLY INSIDE AN ASYNC FUNCTION
async function mysqlselect(db, data) {
const uIdPromise = return newPromise((resolve, reject) => {
let sql = `SELECT id, name FROM users WHERE name = '${data.uName}'`;
db.query(sql, function (err, result) {
if (err) reject(err);
resolve(result[0].id);
});
})
// You can access uId right away here.
const uId = await uIdPromise;
};
注意:如果您想要返回此变量并尝试在某处访问它,则无法执行此操作,因为async
函数将始终返回Promise。您必须在await
函数上async
或执行.then