2017-08-22 3 views
0

私は角度ノードの評価システムを構築しています。そのシステムでは、POST reqとしてサーバーに送信されたIDの配列をループし、forループを使用してこれらのIDをプッシュしようとすると、ユーザーは列を評価する必要があります。"TypeError:複数のリクエストに対して 'push' nullの属性を読み取ることができません

最初のユーザーはループ全体を正常に取得していますが、次のユーザーは2番目のインデックスで失敗します。デバッグ後、私はバックエンドがすべての正しい変数を受け取っていることを発見しました。私はなぜユーザー2のためには機能しないのか分かりませんが、ユーザー1のためです。ここで

は、ここに私のバックエンドのコード

addRatee: function addRatee(req,res) { 
    var decoded = jwt.decode(req.query.token); 
    return model.User.findById(req.params.raterId) 
     .then(function (user) { 
     for (let ratee of req.body.rateeIds) { 
     user.needToRate.push(ratee); 
     } 
     user.update({ 
     needToRate: user.needToRate 
     }).then(function (updatedUser) { 
     return res.status(200).json({ 
      title: "Successfully added users to need to rate", 
      obj: updatedUser 
     }); 
     }).catch(function() { 
     return res.status(400).json({ 
      message: "Error updating user", 
      error: err.toString() 
     }); 
     }); 
    }).catch(function (e) { 
     return res.status(400).json({ 
     message: "Error finding user", 
     error: e.toString() 
     }); 
    }); 
    } 

はここに私のコンポーネントのサービスコード

addRatee(rateeIds: number[], raterId: number) { 
    const headers = new Headers({'Content-Type': 'application/json'}); 
    const token = localStorage.getItem('token') 
     ? '?token=' + localStorage.getItem('token') 
     : ''; 
    const body = { 
     rateeIds: rateeIds 
    }; 
    return this.http.patch(this.devUrl + '/new-ratee/' + raterId + token, body, {headers: headers}); 
    } 

されている私のcomponent.tsコードが

ある
let dRateeIds = [this.trip.rider1Id, this.trip.rider2Id, this.trip.rider3Id]; 
       let r1RateeIds = [this.trip.driverId, this.trip.rider2Id, this.trip.rider3Id]; 
       let r2RateeIds = [this.trip.rider1Id, this.trip.driverId, this.trip.rider3Id]; 
       let r3RateeIds = [this.trip.rider1Id, this.trip.rider2Id, this.trip.driverId]; 
        this.tripService.addRatee(dRateeIds, this.trip.driverId) 
        .subscribe(updatedUser => { 
         console.log(updatedUser); 
         this.tripService.addRatee(r1RateeIds, this.trip.rider1Id) 
         .subscribe(updatedUser2 => { 
          console.log(updatedUser2); 
         this.tripService.addRatee(r2RateeIds, this.trip.rider2Id) 
         .subscribe(updatedUser3 => { 
          console.log(updatedUser3); 
          this.tripService.addRatee(r3RateeIds, this.trip.rider3Id) 
          .subscribe(updatedUser4 => { 
           console.log(updatedUser4); 
          }, resp => console.log(resp)); 
         }, resp => console.log(resp)); 
        }, resp => console.log(resp)); 
       }, resp => console.log(resp)); 

私はにかなり新しいですよ私のコードは混沌としているので、このエラーが発生する理由を探しています。

ここには完全なエラースタックがあります。

{"message":"Error finding user","error":"TypeError: Cannot read property 'push' of null\n at /Users/jonathancorrin/Desktop/workspace/atlas-web/server/controllers/trips.js:1380:24\n at tryCatcher (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/util.js:16:23)\n at Promise._settlePromiseFromHandler (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/promise.js:512:31)\n at Promise._settlePromise (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/promise.js:569:18)\n at Promise._settlePromise0 (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/promise.js:614:10)\n at Promise._settlePromises (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/promise.js:693:18)\n at Async._drainQueue (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/async.js:133:16)\n at Async._drainQueues (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/async.js:143:10)\n at Immediate.Async.drainQueues (/Users/jonathancorrin/Desktop/workspace/atlas-web/node_modules/bluebird/js/release/async.js:17:14)\n at runCallback (timers.js:781:20)\n at tryOnImmediate (timers.js:743:5)\n at processImmediate [as _immediateCallback] (timers.js:714:5)"} 

これは、いくつかの失敗した試行の後で私のpgadminテーブルの外観です。コンフィギュレーション前needsToRate列とレートに値型

USERの必要性をログイン時にここでユーザー2-4

enter image description here

****** UPDATE ためのものであるNULL値は値が記録されます====== null USER TYPE NTR ==========オブジェクト

答えて

1

この問題は、値をnullフィールドにプッシュしようとしていたことでした。このコードで問題を解決しました

for (let ratee of req.body.rateeIds) { 
     if (user.needToRate === null) { 
      user.needToRate = []; 
      user.needToRate.push(ratee) 
     } else { 
      user.needToRate.push(ratee) 
     } 
     } 
関連する問題