2017-10-06 18 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ステートメントを使用してを実行してください。

もう1つのことは、これの完全な要件を知らなくても: データベースからデータをフェッチするだけで、トランザクションを変更する必要はありません。 query()を実行して、beginTransaction()rollback()、およびcommit()のいずれかの呼び出しを省略することができます。

+0

私はプロジェクトの要件に従ってトランザクションが必要です。あなたのコードは動作しますが、あなたが与えたコードを使っている間にどこでcommit()を行うべきか教えていただけますか? @Mihai Potra – Annabelle

+0

通常は、 'result'で' callback'を呼び出すのではなく、最後のブランチで 'commit()'を使用します: } else { //成功を問い合わせます。 。 connection.commit(機能(ERR){ 場合(ERR){// 私たちは失敗したが、あまりにもコミットするためにロールバックする必要があると思います connection.rollback(関数(){ コールバック(ERR); });} else { //コミットも成功しました。 コールバック(null、results); } }); } –

関連する問題