在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.log
sql
时,我得到了如下预期结果

{
    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好的,这能回答你的问题吗?我用了第一种方法,但它说回调没有定义