您好我在第一次回调“selectArticleByTitle(title,callback)”中,终端发送“无法读取未定义的属性'id'”。我不知道如何强制第一个回调来完成这个并启动其他回调。
router.get('/article/:title', function(req, res){
dataBase.selectArticleByTitle(req.params.title, function(db_titleERR, db_titleResults){
console.log(db_titleResults);
dataBase.selectArticle(db_titleResults[0].id, function(db_resultsArticleERR, db_resultsArticle) {
//Get id of the previous article
dataBase.previousArticle(db_titleResults[0].id, function(db_previousIdERR, db_previousId){
//Get id of the next article
dataBase.nextArticle(db_titleResults[0].id, function(db_nextIdERR, db_nextId){
//Get lastArticle
dataBase.lastArticle(function(db_lastArticleERR, db_lastArticle) {
});
});
});
});
});
});
});
exports.selectArticleByTitle = function(title, callback){
connection.query('select * from article where title=?', [title], function(err, row){
if(err)
callback(err, null);
else{
if(row){
callback(null, row);
}
}
});
}
这里的日志 的console.log(db_titleResults);
[RowDataPacket { id:7, 类型:'科学', 图片:'xw', 来源:'xswx', 标题:'zzazzaz', meta:'azazadsq', inputDate:2017-04-15T10:00:00.000Z, 访客:0}] []
提前谢谢
答案 0 :(得分:0)
如果您想坚持使用原始代码,请尝试以下内容...
问题是你被退回一行。但是,您尝试访问结果,就好像在数组中返回了许多行一样。
下面至少应该摆脱你的错误。我建议也检查结果的长度。如果定义了db_titleResults.length
,那么你知道sql返回了一个数组。
而不是db_titleResults[0].id
,您应该使用db_titleResults.id
。
router.get('/article/:title', function(req, res){
dataBase.selectArticleByTitle(req.params.title, function(db_titleERR, db_titleResults){
console.log(db_titleResults);
dataBase.selectArticle(db_titleResults.id, function(db_resultsArticleERR, db_resultsArticle) {
//Get id of the previous article
dataBase.previousArticle(db_titleResults.id, function(db_previousIdERR, db_previousId){
//Get id of the next article
dataBase.nextArticle(db_titleResults.id, function(db_nextIdERR, db_nextId){
//Get lastArticle
dataBase.lastArticle(function(db_lastArticleERR, db_lastArticle) {
});
});
});
});
});
});
});
我不确定您使用什么库连接到sql,但可以通过以下方法避免嵌套回调:
const sql = require('mssql')
sql.connect(config, err => {
// ... error checks
const request = new sql.Request()
request.stream = true // You can set streaming differently for each request
request.query('select * from article where title=?', [title])
request.on('row', row => {
// Emitted for each row in a recordset
dataBase.selectArticle(row.id, ...);
dataBase.previousArticle(row.id, ...);
dataBase.lastArticle(row.id, ...);
});
request.on('error', err => {
// May be emitted multiple times
});
});