【问题标题】:Nodejs MySQL connection query return value to function callNodejs MySQL连接查询返回值到函数调用
【发布时间】:2013-03-16 04:09:02
【问题描述】:

我正在尝试从数据库中获取价值。通过演示示例进行尝试。但我在同步调用时遇到问题,尝试使用回调函数。我是node.js的初学者,所以不知道这是否正确。

文件 1:app.js

var data;

var db = require('./db.js');

var query = 'SELECT 1 + 1 AS solution';

var r = db.demo(query, function(result) { data = result; });

console.log( 'Data : ' + data);

文件 2:db.js

var mysql      = require('./node_modules/mysql');

var connection = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : 'root',
});

module.exports.demo = function(queryString, callback) {
    try {
        connection.connect();
        console.log('Step 1');

        connection.query(queryString, function(err, rows, fields) {
            console.log('Step 2');
            if (err) {
                console.log("ERROR : " + err);
            }
            console.log('The solution is: ', rows[0].solution);

            callback(rows[0].solution);

            return rows[0].solution;
        });
        callback();

        connection.end();
        console.log('Step 3');
    }
    catch(ex) {
        console.log("EXCEPTION : " + ex);
    }
};

输出:

Step 1
Step 3
Data : undefined
Step 2
The solution is:  2

也提到了这个问题,但它没有解决我的问题: nodeJS return value from callback

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    问题是这样的:

    var r = db.demo(query, function(result) { data = result; });
    
    console.log( 'Data : ' + data);
    

    console.log 将在回调函数被调用之前运行,因为db.demo 是异步的,这意味着它可能需要一些时间才能完成,但代码的下一行 console.log 将一直是执行。

    如果要访问结果,需要等待回调函数被调用:

    var r = db.demo(query, function(result) { 
      console.log( 'Data : ' + result);
    });
    

    这就是大多数处理 I/O 的代码在 Node 中的运行方式,因此了解它很重要。

    【讨论】:

    • 非常感谢。它以应有的方式执行,但我有疑问,通过使用上述方法,我们只能对回调函数范围内的结果执行操作,对吧..?
    • 如果我想在函数调用后对数据执行操作,它会起作用吗..?
    • 不,它不会,但这就是 Node 的工作方式。有些库可以缓解这种工作流程,例如 q
    【解决方案2】:

    这是我的解决方案

    在 db.js 文件中

    
    require('dotenv').config();
    const mysql = require('mysql');
    
    const con = mysql.createConnection({
      user: process.env.SQL_USER,
      host: process.env.SQL_HOST,
      database: process.env.SQL_DB,
      password: process.env.SQL_PSWD,
      port: 3306,
    });
    
    async function connect() {
      try {
        await con.connect();
        console.log("Connected to MySql!");
      } catch (err) {
        console.log(err);
      }
    }
    
    module.exports = { connect };
    

    然后在另一个文件index.js中

    const db = require("./data/db");
    
    db.connect();
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2021-05-10
    • 2018-05-26
    • 1970-01-01
    相关资源
    最近更新 更多