在NodeJS的MySQL查询函数之外扩展变量
我试图运行一个返回值的函数,但是没有定义在NodeJS的MySQL查询函数之外扩展变量,mysql,node.js,Mysql,Node.js,我试图运行一个返回值的函数,但是没有定义 function getMessageId(myId, user){ $query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+ myId+"')"; connect.query($query, function(error, row
function getMessageId(myId, user){
$query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+ myId+"')";
connect.query($query, function(error, rows){
sql = rows[0];
console.log(sql);
return sql.id;
})
}
// running the function
msgId = getMessageId(userFrom, userTo);
console.log(msgId);
现在,当我尝试console.logsql
时,我得到了如下预期结果
{
id : 3,
userFrom : 3,
userTo : 1,
type : "normal",
date : "2017-06-25 06:56:34",
deleted : 0
}
但是当我在console.log中记录
msgId
时,我得到了未定义的。我在NodeJS上做这个,请提供更好的解决方案?简短回答,因为这是一个异步操作。
外部console.log发生在getMessageId
返回之前
如果使用回调,您可以将getMessageId
重写为
let msgId
function getMessageId(myId, user, callback){
$query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+ myId+"')";
return connect.query($query, function(error, rows){
sql = rows[0];
console.log(sql);
callback(sql.id);
})
}
function setMsgId(id) {
msgId = id;
}
然后称之为,
getMessageId(userFrom、userTo、setMsgId)代码>
此外,我建议您研究一下承诺。
这将很好地简化流程
使用,getMessageId
应该类似
function getMessageId(myId, user){
$query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND
userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+
myId+"')";
const promise = new Promise((resolve, reject) => {
connect.query($query, function(error, rows){
sql = rows[0];
console.log(sql);
resolve(sql.id);
})
return promise.
}
发布此内容,您可以将其用作
getMessageId(myId,user)。然后((msgId)=>console.log(msgId))
简短回答,因为这是一个异步操作。
外部console.log发生在getMessageId
返回之前
如果使用回调,您可以将getMessageId
重写为
let msgId
function getMessageId(myId, user, callback){
$query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+ myId+"')";
return connect.query($query, function(error, rows){
sql = rows[0];
console.log(sql);
callback(sql.id);
})
}
function setMsgId(id) {
msgId = id;
}
然后称之为,
getMessageId(userFrom、userTo、setMsgId)代码>
此外,我建议您研究一下承诺。
这将很好地简化流程
使用,getMessageId
应该类似
function getMessageId(myId, user){
$query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND
userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+
myId+"')";
const promise = new Promise((resolve, reject) => {
connect.query($query, function(error, rows){
sql = rows[0];
console.log(sql);
resolve(sql.id);
})
return promise.
}
发布此内容,您可以将其用作
getMessageId(myId,user)。然后((msgId)=>console.log(msgId))
创建一个用于mysql的包装器
// service/database/mysql.js
const mysql = require('mysql');
const pool = mysql.createPool({
host : 'host',
user : 'user',
password : 'pass',
database : 'dbname'
});
const query = (sql) => {
return new Promise((resolve, reject) => {
pool.query(sql, function(error, results, fields) {
if (error) {
console.error(error.sqlMessage);
return reject(new Error(error));
}
resolve(results);
});
});
}
module.exports = { query };
然后使用异步函数从另一个脚本调用并等待
// another file, with express route example
const db = require('/service/database/mysql.js')
module.exports = async (req, res) => { // <-- using async!
let output = []; // <-- your outside variable
const sql = 'SELECT * FROM companies LIMIT 10';
await db.query(sql) // <-- using await!
.then(function(result) {
output = result; // <-- push or set outside variable value
})
.catch(e => {
console.log(e);
});
// await db.query("next query" ...
// await db.query("next query" ...
// await db.query("next query" ...
res.json(output);
}
//另一个文件,带有express route示例
const db=require('/service/database/mysql.js')
module.exports=async(req,res)=>{/创建用于mysql的包装器
// service/database/mysql.js
const mysql = require('mysql');
const pool = mysql.createPool({
host : 'host',
user : 'user',
password : 'pass',
database : 'dbname'
});
const query = (sql) => {
return new Promise((resolve, reject) => {
pool.query(sql, function(error, results, fields) {
if (error) {
console.error(error.sqlMessage);
return reject(new Error(error));
}
resolve(results);
});
});
}
module.exports = { query };
然后使用异步函数从另一个脚本调用并等待
// another file, with express route example
const db = require('/service/database/mysql.js')
module.exports = async (req, res) => { // <-- using async!
let output = []; // <-- your outside variable
const sql = 'SELECT * FROM companies LIMIT 10';
await db.query(sql) // <-- using await!
.then(function(result) {
output = result; // <-- push or set outside variable value
})
.catch(e => {
console.log(e);
});
// await db.query("next query" ...
// await db.query("next query" ...
// await db.query("next query" ...
res.json(output);
}
//另一个文件,带有express route示例
const db=require('/service/database/mysql.js')
module.exports=异步(请求、恢复)=>{//您的观察结果似乎与您向我们展示的代码不一致。但在任何情况下,您都应该使用准备好的语句。您的观察结果似乎与您向我们展示的代码不一致。但在任何情况下,您都应该使用准备好的语句。这是否回答了您的问题?我使用了第一种方法,但它说回调不是de好的,这能回答你的问题吗?我用了第一种方法,但它说回调没有定义