2017-03-18 3 views
0

私はLaravelフレームワークを使用し、Laracastチュートリアルで自分のコード構造をベースにして、複数のREST APIプロジェクトを作成しました。しかし、NodeJをバックエンドとして使用していくつかのプロジェクトを移動することに決めました。私はノードを学ぶようになり、ノードでそれを複製しようとしています。私は単一のオブジェクトの応答のためにそれを行うことができましたが、複数のオブジェクトに対しては動作させることができません。NodeJs:Laravel PHPフレームワークのようなデータトランスフォーマー

index(req,res) { 
    User 
     .findAll() 
     .then(function(users){ 
     res.json(api.respond(transfomer.transformCollection(users))); 
     }) 
     .catch(function(error){ 
     res.json(api.respondWithError('users not found',error)); 
     }); 
    } 

APIコントローラ:ここ

は私のコントローラである

module.exportsは= {

// response w/o error 
    respond: function(data,msg,status) { 
    if (msg == null) { 
     return { 
     'status': status || true, 
     'data': data 
     }; 
    } else { 
     return { 
     'status': true, 
     'message': msg, 
     'data': data 
     }; 
    } 
    }, 

    // response with error 
    respondWithError: function(msg,error) { 
    var self = this; 
    var status = false; 
    var data = { 
     'error': error 
    }; 
    return this.respond(data,msg,status); 
    }, 
}; 

transformer.js

module.exports = { 

    // single transformation 
    transform (user) { 
    return { 
     'id' : user.id, 
     'username': user.username, 
     'firstname': user.firstname, 
     'lastname': user.lastname, 
     'address': user.address, 
     'phone': user.phone, 
     'mobile': user.mobile, 
     'status': user.status 
    }; 
    }, 

    // 
    transformCollection(users) { 
    var self = this; 
    var data = []; 
    for (var i = 0; i <= users.length; i++) { 
     data.push(this.transform(users[i])); 
    } 
    return data; 
    } 

}; 

サンプル出力

{ 
    "status": true, 
    "data": [ 
    { 
     "id": 1, 
     "username": "[email protected]", 
     "firstname": "Jon", 
     "lastname": "Doe", 
     "address": "Homes", 
     "phone": "+966501212121", 
     "mobile": "+966501212121", 
     "status": "NOT VERIFIED" 
    }, 
    { 
     "id": 1, 
     "username": "[email protected]", 
     "firstname": "Jon", 
     "lastname": "Doe", 
     "address": "Homes", 
     "phone": "+966501212121", 
     "mobile": "+966501212121", 
     "status": "NOT VERIFIED" 
    }, 
    { 
     "id": 1, 
     "username": "[email protected]", 
     "firstname": "Jon", 
     "lastname": "Doe", 
     "address": "Homes", 
     "phone": "+966501212121", 
     "mobile": "+966501212121", 
     "status": "NOT VERIFIED" 
    }, 
    { 
     "id": 1, 
     "username": "[email protected]", 
     "firstname": "Jon", 
     "lastname": "Doe", 
     "address": "Homes", 
     "phone": "+966501212121", 
     "mobile": "+966501212121", 
     "status": "NOT VERIFIED" 
    }, 
    ] 
} 

申し訳ありませんが、私はノードで新しくなっています。私はさまざまな方法で試してみましたが、まだエラーが出ています。 Btw私はデータベースのsequelizeを使用しています。

ありがとうございました。

+0

あなたのコントローラーで 'transform(user)'を呼び出していますが、 'user'ではなく' users'を持っています。 –

+0

私はLarvalを知りませんが、 'express 'のような人気のあるnodejsフレームワークで利用可能な'ミドルウェア 'について読むことができます。あなたが望むものを手に入れることができると思います。そしてサイドノートでは、変数の '$'プレフィックスを削除することができます:) –

+0

@RonDadon私はこれがミドルウェアではないと思います。私は、このコードでjwtトークン認証にミドルウェアを使用しました。それは単にデータを変換することです。 dbから返された複数のオブジェクトをループし、それぞれのオブジェクトをフォーマットからフォーマットします。 –

答えて

0

私の質問に答えが見つかりました。sequelizeは、結果をrawに戻して設定するためにコントローラを変更しなければならなかったデータベース結果とは別のプロパティを持つオブジェクトとして結果を返しています。照会からのオブジェクトの配列はデータベースからの結果です。

index(req,res) { 
    User 
     .findAll({ raw: true }) // added "raw: true" 
     .then(function(users){ 
     res.json(api.respond(transfomer.transformCollection(users))); 
     }) 
     .catch(function(error){ 
     res.json(api.respondWithError('users not found',error)); 
     }); 
    }, 

これはデータベースからオブジェクトの配列を返し、そこからデータトランスフォーマが正常に動作しています。すべての助けをありがとう。

関連する問題