在NodeJS

时间:2017-06-25 06:37:58

标签: 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, 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
}

但是当我调试.log msgId时,我得undefined。我在NodeJS上做这个,请问更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

简短回答,因为它是一个异步操作。 外部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);

此外,我建议你研究一下Promises 这将很好地简化流程。

使用PromisesgetMessageId应该类似于

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).then((msgId) => console.log(msgId))

答案 1 :(得分:0)

创建一个供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);
}