Nodejs回调中的Mysql回调

时间:2017-04-16 01:59:32

标签: javascript mysql node.js callback

您好我在第一次回调“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}] []

提前谢谢

1 个答案:

答案 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
    });
});