[英]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.