2017-04-16 110 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模塊。 –