【问题标题】:node.js flow not correct when getting data from mysql database从mysql数据库获取数据时node.js流程不正确
【发布时间】:2013-09-16 19:35:30
【问题描述】:

我正在使用 Node.js、Express 和 EJS 开发一个小程序。

基本上我有一个post api路由如下:

app.post('/getJson', function (req, res) {

    var jsonData = fetchData(req.body.selectpicker);
    console.log('jsonData' + jsonData);
    res.render('result.ejs', {
            html: '<p>' + jsonData + '</p>'
    });
});

fetchdata 函数执行以下操作:

function fetchData(tableName)
{
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
        host : 'xxxx',
        user : 'xxxx',
        password : 'xxxx!',
        database : 'xxxxx',
        port : 'xxxx'

    });

    connection.connect(function(err) {
        console.log('error' + err);
        // connected! (unless `err` is set)
    });

    var query = "SELECT * FROM " + tableName;
    var data = [];
    connection.query(query, function(err, rows, fields)
    {
        if (err) throw err;
        data = rows;

        console.log('The rows are: ', rows);    
    });

    connection.end();
    console.log('datsa' + data);
    return data;
}

但我的问题是,当 connection.query 首次运行时,它不会进入回调函数,而是直接进入 connection.end()。但是在它退出 fetchData 函数之后,它会继续运行回调函数,该函数返回查询后的行?

有什么想法吗?

我认为这可能与 api 的工作方式有关?

【问题讨论】:

  • node js 是一个事件驱动的编程,所以它遵循事件的顺序

标签: javascript mysql node.js


【解决方案1】:

connection.query 是异步的,因此您必须使用回调函数来处理查询结果。

您的代码稍作修改:

API 路由:

app.post('/getJson', function (req, res) {

    fetchData(req.body.selectpicker, function(jsonata) {
        console.log('jsonData' + jsonData);
        res.render('result.ejs', {
            html: '<p>' + jsonData + '</p>'
        });
    });
});

fetchdata函数:

function fetchData(tableName, done)
{
    var mysql      = require('mysql');
    var connection = mysql.createConnection({
        host : 'xxxx',
        user : 'xxxx',
        password : 'xxxx!',
        database : 'xxxxx',
        port : 'xxxx'

    });

    connection.connect(function(err) {
        console.log('error' + err);
        // connected! (unless `err` is set)
    });

    var query = "SELECT * FROM " + tableName;

    connection.query(query, function(err, rows, fields)
    {
        if (err) throw err;
        console.log('The rows are: ', rows);   
        done(rows); 
    });

    connection.end();
}

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多