从我的模型中,我从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很陌生。谢谢!
答案 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()
来电。