2017-04-16 67 views
0

你好我卡在我的第一个回调“selectArticleByTitle(title,callback)”中,终端发送“无法读取未定义的属性'id'”。我不知道如何强制第一个回调来完成这个并启动其他的。Nodejs回调在回调中的Mysql回调

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', 元: 'azazadsq', inputDate: 2017-04-15T10:00:00.000Z, 游客:0}] []如果你想坚持原来的代码

预先感谢您

+0

尝试打印出来行的内容,以帮助看看你正在退回。 'console.log(row);' –

+0

好吧,我编辑了我的帖子。 –

+0

不幸的是,尽管这绝对不是最好的解决方案,但您可以参与业界所称的_callback hell_,您在等待一个回调之前完成另一个回调。我很想看看其他解决方案。 – henry

回答

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 
    }); 
}); 
+0

谢谢你,我正在使用mysql模块。 –