2017-06-28 14 views
0

私のバックエンドExpress APIからデータを取得しようとしました。私はmongodbとmongooseも使用しています。ここに私のコードは次のとおりです。 コード:Expressの応答:配列をJSONとして送信

const show = (req, res) => { 
    const product = {} 
    product.array = new Array() 
    console.log(req.cart.product[1]) 
    for (let i = 0; i < req.cart.product.length; i++) { 
    Product.find({_id: ObjectId(req.cart.product[i])},function(err,products){ 
     if (err) { 
      res.sendStatus(500) 
     } else { 
       product.array.push(products) 
       console.log(product.array) 
      } 
      }) 
     } 
     req.cart.product = product.array 
      res.json({ 
      cart: req.cart.toJSON({ virtuals: true, user: req.user }) 
      }) 
    } 

Console.logs:

[ [ { _id: 5952b57ea52d092b8d34c6b0, 
     name: 'test00000', 
     price: 0, 
     description: 'test', 
     __v: 0 } ] ] 
[ [ { _id: 5952b57ea52d092b8d34c6b0, 
     name: 'test00000', 
     price: 0, 
     description: 'test', 
     __v: 0 } ], 
    [ { _id: 5952b57ea52d092b8d34c6b0, 
     name: 'test00000', 
     price: 0, 
     description: 'test', 
     __v: 0 } ] ] 

URLの応答:コンソールログで

{ 
    "cart": { 
     "_id": "5953b153d2108941d15a7fe9", 
     "updatedAt": "2017-06-28T13:38:27.406Z", 
     "createdAt": "2017-06-28T13:38:27.406Z", 
     "owner": "595153ad6f18427ef38c416b", 
     "__v": 0, 
     "product": [], 
     "id": "5953b153d2108941d15a7fe9", 
     "editable": false 
    } 
} 

すべてが、私は製品の配列で返すようにしたいものです私の応答のために、それは私がそれをプッシュして配列を設定しません。何かご意見は?

答えて

0

同期コード内で非同期コード(例:Dbクエリ)を呼び出そうとしています(forループなど)。そのため、初めてデータを取得するとクライアントにデータが返されます。この問題を解決するには、asyncまたはpromise.allを使用できます。

var async = require('async') 

const show = (req, res) => { 
    const product = {} 
    product.array = new Array() 
    console.log(req.cart.product[1]) 
    async.each(req.cart.product, function(id, cb){ 
     Product.find({_id: ObjectId(id)},function(err,products){ 
      if (err) { 
      cb(err) 
      } else { 
      product.array.push(products) 
      console.log(product.array) 
      cb() 
      } 
     }) 
    }, function(err){ 
     if (err) { 
      return res.sendStatus(500) 
     } else { 
      req.cart.product = product.array 
      return res.json({ 
      cart: req.cart.toJSON({ virtuals: true, user: req.user }) 
      }) 
     } 
    }) 
} 

約束ベースのソリューション:

const show = (req, res) => { 
    const product = {} 
    product.array = new Array() 
    console.log(req.cart.product[1]) 

    const promises = []  
    req.cart.product.forEach(function(id){ 
     promises.push(Product.find({_id: ObjectId(req.cart.product[i])})) 
    }) 

    Promise.all(req.cart.product.map(function(id) { 
     return Product.find({_id: ObjectId(id)}) 
    })).then(function(products){ 
     req.cart.product = product.array 
     return res.json({ 
      cart: req.cart.toJSON({ virtuals: true, user: req.user }) 
     }) 
    }).catch(function(err){ 
     return res.sendStatus(500) 
    }) 
} 
関連する問題