如何从Node.js中的嵌套函数返回db的结果

时间:2019-11-06 10:27:52

标签: mysql node.js

我希望将结果保存在其他文件上,但没有获取返回的方法

function getUsers(){
console.log("Fetching all user data");

const connection = getConnection();
const sql = "SELECT * FROM users";
var result = connection.query(sql,(err, rows, fields) =>{

    if(err){
        console.log("Failed to get users data");
        res.sendStatus(500);
        throw err;
    }

    console.log("Fetched Users Successfully");
    return rows;
})

return result;
}

4 个答案:

答案 0 :(得分:0)

由于代码是异步的,因此无法获得结果。因此,您必须使用async / await来获得结果。您的代码应如下所示:-

async function getUsers(){
console.log("Fetching all user data");

const connection = await getConnection();
const sql = "SELECT * FROM users";
try {
var result = await connection.query(sql);
console.log("Fetched Users Successfully");
return result;
} catch (err) {
    console.log("Failed to get users data");
    res.sendStatus(500);
    throw err;
}

} 

最后,像这样调用此函数:-

var output = await getUsers();

但是请确保您在异步函数中调用此行。 希望这会有所帮助!

答案 1 :(得分:0)

为功能创建文件:getUsers.js

 module.exports = async getUsers(){

    const connection = getConnection();
    const sql = "SELECT * FROM users";

    var myPromise = () => {
        return new Promise((resolve, reject) => {
            connection.query(sql, query.params, function (error, results, fields) {
                error ? reject(error) : resolve(results);
            })

        });
    }
    var result = await (myPromise());
    return result;
}

需要此文件并调用函数:

var getUsers = require('..path to getUsers');

var data =  getUsers().then((data)=>{

}).catch((error)=>{
    console.log('error',error)
    return error;
});

使用回调:

或使用回调函数:

 module.exports = function getUsers(callback){

const connection = getConnection();
const sql = "SELECT * FROM users";

  connection.query(sql, query.params, function (error, results, fields) {
      if(error){ callback(error,null)}  
      if(!error && results){
         callback(null,results)
      }
  });
}

需要文件:

var getUsers = require('..path to getUsers');

这样称呼:

getUsers(err,data)=>{
   if(err){
      return res.send(err);
   }
   if(!err && data){
     return res.send(data);
   }
}

答案 2 :(得分:0)

function getUsers(callback) {
    console.log("Fetching all user data");
    const connection = getConnection();
    const sql = "SELECT * FROM users";
    connection.query(sql, (err, rows, fields) => {
        if (err) {
            console.log("Failed to get users data");
            res.sendStatus(500);
            callback(err, null);
        }

        console.log("Fetched Users Successfully");
        callback(null, rows)
    })
}

// USE ABOVE FUNCTION AS BELOW...

getUsers(function(err, rows) {
    if(err){
        console.error(err);
    }
    console.log(rows);
})

答案 3 :(得分:0)

这是一个标准的异步函数问题。 return rows不会为result变量分配行。 query()函数的第二个参数是一个回调函数,它指示将在获取行之后执行的代码块。这意味着查询结果仅在回调块内可见。

您可以通过2种方式修复它:

  1. 在回调函数块中编写所有使用SQL结果的代码(例如,您可以在此时调用另一个函数并将结果作为参数传递)。 如果您不熟悉javascript编程,则此方法更简单。我看到您想在其他地方使用函数getUsers()。如果选择这种方法,最好的方法可能是将回调传递给getUsers()函数,然后在query()方法的回调中调用它。

示例:

getUsers(callback){
   const connection = getConnection();
   const sql = "SELECT * FROM users";
   connection.query(sql,(err, rows, fields) => callback(rows))
}  
mainFunction(req,res){ 
   getUsers(doSomethingWithUsers)
 }

doSomethingWithUsers(users){
  ...
}

这当然是过分简化的模式,但是思路应该很清楚。

  1. 研究promise及其如何处理异步功能。这将需要您将函数主体“包装”为Promise对象类型。 他们将允许您编写如下内容:

    mainFunction(){
      getUsers()。then(result => ....);
      //甚至
      const users =等待getUsers();
    }

编辑:
要包装“ promise的返回值”或如我们所说的“解决promise”,可以按以下方式包装函数:

function getUsers(){
  console.log("Fetching all user data");

  const connection = getConnection();
  const sql = "SELECT * FROM users";
  return new Promise( (resolve,reject) => {
    var result = connection.query(sql,(err, rows, fields) =>{
      if(err){
        // this will cause promise to "fail"
        reject(err);
      }
      console.log("Fetched Users Successfully");
      // this will tell javascript that promise is finished
      // and rows are accesable in then() 
      resolve(rows);
   })
  })
}

function mainFunction(){
  const result = getUsers()
  .then(rows =>{/** this will happen if resolve(rows) is called */})
  .catch(error => {/** this will be executed if reject(err) happens 
   */}); 
}

// or... (Try/Catch is required since "await" silently fails
async function asyncMainFunction(){
 try{
 const rows = await getUsers();
 // You can use rows from resolve() here;
 }catch(error){
  // here, reject is called
 }

}

这里是一个链接,您可以在其中阅读有关诺言的更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise