2017-10-06 110 views
1

從我的模型中,我從用戶的MySQL數據庫中獲取一些文章。nodejs-無法將結果返回給控制器功能

型號

var mysql = require('mysql'); 
var db = mysql.createPool({ 
    host: 'localhost', 
    user: 'sampleUser', 
    password: '', 
    database: 'sampleDB' 
}); 

fetchArticles: function (user, callback) { 
    var params = [user.userId]; 
    var query = `SELECT * FROM articles WHERE userId = ? LOCK IN SHARE MODE`; 
    db.getConnection(function (err, connection) { 
     if (err) { 
      throw err; 
     } 
     connection.beginTransaction(function (err) { 
      if (err) { 
       throw err; 
      } 
      return connection.query(query, params, function (err, result) { 
       if (err) { 
        connection.rollback(function() { 
         throw err; 
        }); 
       } 
       //console.log(result); 
      }); 
     }); 
    }); 
} 

這是工作和獲取功能所需要的結果。但是它並沒有將結果返回給控制器函數(我正在返回它,但是我無法在控制器函數中獲取它,我想我在這裏做了一些錯誤)。

當我做了console.log(result)這就是我得到的。

[ RowDataPacket { 
    status: 'New', 
    article_code: 13362, 
    created_date: 2017-10-22T00:30:00.000Z, 
    type: 'ebook'} ] 

我的控制器功能如下:

var Articles = require('../models/Articles'); 
exports.getArticle = function (req, res) { 

    var articleId = req.body.articleId; 
    var article = { 
     userId: userId 
    }; 

    Articles.fetchArticles(article, function (err, rows) { 
     if (err) { 
      res.json({ success: false, message: 'no data found' }); 
     } 
     else { 
      res.json({ success: true, articles: rows }); 
     } 
    }); 
}; 

誰能幫我找出什麼錯誤我在這裏做? 我很新的nodejs。謝謝!

回答

1

簡單的答案是,您不在任何地方撥打callback函數。 這裏的調整代碼:

fetchArticles: function (user, callback) { 
    var params = [user.userId]; 
    var query = `SELECT * FROM articles WHERE userId = ? LOCK IN SHARE MODE`; 
    db.getConnection(function (err, connection) { 
     if (err) { 
      // An error. Ensure `callback` gets called with the error argument. 
      return callback(err); 
     } 

     connection.beginTransaction(function (err) { 
      if (err) { 
       // An error. Ensure `callback` gets called with the error argument. 
       return callback(err); 
      } 

      return connection.query(query, params, function (err, result) { 
       if (err) { 
        // An error. 
        // Rollback 
        connection.rollback(function() { 
         // Once the rollback finished, ensure `callback` gets called 
         // with the error argument. 
         return callback(err); 
        }); 
       } else { 
        // Query success. Call `callback` with results and `null` for error. 
        //console.log(result); 
        return callback(null, result); 
       } 
      }); 
     }); 
    }); 
} 

有扔在connection方法回調中的錯誤是沒有意義的,因爲這些功能是異步。 確保您將錯誤傳遞給callback,並停止執行(使用return語句)

還有一件事,不知道這個的全部要求: 我不確定你需要事務從數據庫中獲取數據,而不需要修改它;因此您只需執行query()並跳過使用任何beginTransaction(),rollback()commit()調用。

+0

我確實需要按照項目要求進行交易。你的代碼可以工作,但是你可以告訴我在使用你提供的代碼時,在哪裏做commit()? @Mihai Potra – Annabelle

+0

通常你會在最後一個分支中使用'commit()',而不是用'result'調用'callback',如下所示: } else { //查詢成功。 。 connection.commit(函數(ERR){ 如果(ERR){// 我想我們需要回滾失敗的承諾太 connection.rollback(函數(){ 回調(ERR); });} else { //提交成功, callback(null,results); } }); } –