我正在尝试创建一个返回true的函数,如果它检测到在nodejs的特定列中包含值的行。
我尝试使用来自query()的结果变量,但没有成功:
let rowexists = (mystring) => {
let exists = false;
let sql = "SELECT EXISTS( SELECT 1 FROM mytable WHERE `mycolumn` = '" + mystring + "')";
connection.query(sql, function(error, result, field){
console.log((result[sql]));
console.log(exists);
exists = (result[sql]);
});
return exists;
}
console.log(rowexists("myvalue"));
如果存在具有“ myvalue”值(存在)的行,则rowexists()始终返回false。
我的问题实际上不是异步的,而是两者都是
console.log((result[sql]));
和
console.log(exists);
返回未定义。
答案 0 :(得分:1)
在这种情况下,诺言很有用。
您遇到的问题是,在函数返回时查询尚未完成运行。因此,返回承诺后,我们可以在以后返回值。
侧面说明:使用SQL数据库时,您应该使用prepared queries。
let rowexists = (mystring) => {
// Return a new promise
return new Promise(resolve => {
// Create the sql query (this uses placeholders)
// Hard coded values don't need to be placeholders but just for example:
let sql = "SELECT 1 FROM ?? WHERE ?? = ?";
// Query the database replacing the ?? and ? with actual data
connection.query(sql, ['mytable', 'mycolumn', mystring], function(error, result, field){
// Result will either be undefined or a row.
// Convert it to a boolean and return it.
resolve(!!result)
});
});
}
// Get the data
rowexists("myvalue").then(result => console.log(result))
使用异步/等待的自动调用功能:
(async function() {
let exists = await rowexists('myothervalue')
console.log(exists)
// The rest of your related code
})()
如果您不喜欢then()
语法,则可以使用async/await
。您可以通过以下两种方式进行操作:
使用异步/等待的基本功能:
async function test() {
let exists = await rowexists('mythrirdvalue')
console.log(exists)
// The rest of your related code
}
test()