mysql - nodejs-无法将结果返回给 Controller 函数

标签 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);
            });
        });
    });
}

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

当我执行 console.log(result) 时,这就是我得到的结果。

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

我的 Controller 函数如下所示:

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 很陌生。谢谢!

最佳答案

简单的答案是您没有在任何地方调用 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 方法的回调中抛出错误是没有意义的,因为这些函数是异步的。 确保将错误传递给 回调,并停止执行(使用return 语句)

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

关于mysql - nodejs-无法将结果返回给 Controller 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46602297/

相关文章:

json - 如何将 JSON 包集成到 Jade 模板中?

javascript - 原型(prototype)模式创建新属性

mysql - SQL根据另一个相关表中列的相应最小值/最大值(值)获取值

mysql - 如何在单行mysql laravel中搜索多个数据

node.js - 无法通过身份验证将文件从 super 测试上传到 multer

javascript - 无法理解nodejs代码

javascript - 如何向外部 API 发出 GET 和 POST 请求?

mysql - SQL select count for more than one like

MySQL 过滤步骤

node.js - 运行 Node 命令作为 grunt 驱动的 QUnit 测试的一部分