nodejs-无法将结果返回给控制器功能

时间:2017-10-06 09:12:02

标签: mysql node.js express

从我的模型中,我从MySQL数据库中为用户提取了一些文章。

模型

var mysql = require('mysql');
var db = mysql.createPool({
    host: 'localhost',
    user: 'sampleUser',
    password: '',
    database: 'sampleDB'
});

fetchArticles: function (user, callback) {
    var params = [user.userId];
    var query = `SELECT * FROM articles WHERE userId = ? LOCK IN SHARE MODE`;
    db.getConnection(function (err, connection) {
        if (err) {
            throw err;
        }
        connection.beginTransaction(function (err) {
            if (err) {
                throw err;
            }
            return connection.query(query, params, function (err, result) {
                if (err) {
                    connection.rollback(function () {
                        throw err;
                    });
                }
                //console.log(result);
            });
        });
    });
}

这是有效的,该函数获取所需的结果。但是它没有将结果返回给控制器函数(我正在返回它,但是我无法在控制器函数中获取它。我猜,我在这里做错了。)

当我做console.log(result)这就是我得到的。

[ RowDataPacket {
    status: 'New',
    article_code: 13362,
    created_date: 2017-10-22T00:30:00.000Z,
    type: 'ebook'} ]

我的控制器功能如下所示:

var Articles = require('../models/Articles');
exports.getArticle = function (req, res) {

    var articleId = req.body.articleId;
    var article = {
        userId: userId
    };

    Articles.fetchArticles(article, function (err, rows) {
        if (err) {
            res.json({ success: false, message: 'no data found' });
        }
        else {
            res.json({ success: true, articles: rows });
        }
    });
};

任何人都可以帮我弄清楚我在这里犯了什么错误吗? 我对nodejs很陌生。谢谢!

1 个答案:

答案 0 :(得分:1)

简单的答案是,您无法在任何地方调用callback函数。 这是经过调整的代码:

fetchArticles: function (user, callback) {
    var params = [user.userId];
    var query = `SELECT * FROM articles WHERE userId = ? LOCK IN SHARE MODE`;
    db.getConnection(function (err, connection) {
        if (err) {
            // An error. Ensure `callback` gets called with the error argument.
            return callback(err);
        }

        connection.beginTransaction(function (err) {
            if (err) {
                // An error. Ensure `callback` gets called with the error argument.
                return callback(err);
            }

            return connection.query(query, params, function (err, result) {
                if (err) {
                    // An error.
                    // Rollback
                    connection.rollback(function () {
                        // Once the rollback finished, ensure `callback` gets called 
                        // with the error argument.
                        return callback(err);
                    });
                } else {
                  // Query success. Call `callback` with results and `null` for error.
                  //console.log(result);
                  return callback(null, result);
                }
            });
        });
    });
}

connection方法的回调中抛出错误毫无意义,因为这些函数是异步的。 确保您将错误传递给callback,并停止执行(使用return语句)

还有一件事,不知道这个的全部要求: 我不确定您是否需要从数据库中获取数据的事务,而不进行修改;因此,您只需执行query()并跳过使用任何beginTransaction()rollback()commit()来电。