簡體   English   中英

回調中的Nodejs Mysql回調

[英]Nodejs Mysql callback in 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,體裁:'Sciences',圖片:'xw',來源:'xswx',標題:'zzazzaz',meta:'azazadsq',輸入日期:2017-04-15T10:00:00.000Z,訪客:0}] []

先感謝您

如果您想堅持使用原始代碼,請嘗試以下操作...

問題是您將返回一行。 但是,您試圖訪問結果,就像在數組中返回許多行一樣。

以下至少應該擺脫您的錯誤。 我建議也檢查結果的長度。 如果定義了db_titleResults.length ,則您知道sql返回了一個數組。

應該使用db_titleResults.id代替db_titleResults[0].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
    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM