2016-12-31 2 views
0

この追加履歴ページを入力した2人のクライアントから子ローレコード(追加履歴)をプッシュするとエラーが発生します。同時。 1つのクライアントだけ子レコードをプッシュするだけです(つまり、クライアント1にレコードをプッシュするためにヒストリページを追加し、レコードをプッシュするためにヒストリページを追加する)。ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:344:11)で送信された後にヘッダーを設定できません

AngularJSではレコードロック処理が必要ですか?

NodeJSサービスの誤差がある:それはまた、バックエンドが停止nodejsやニーズを再起動する原因と

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
    at ServerResponse.header (/home/oracle/node/ang_backend1/node_modules/express/lib/response.js:718:10) 
    at ServerResponse.send (/home/oracle/node/ang_backend1/node_modules/express/lib/response.js:163:12) 
    at ServerResponse.json (/home/oracle/node/ang_backend1/node_modules/express/lib/response.js:249:15) 
    at /home/oracle/node/ang_backend1/routes/datas.js:53:21 
    at /home/oracle/node/ang_backend1/node_modules/mongoose/lib/model.js:3324:16 
    at /home/oracle/node/ang_backend1/node_modules/mongoose/lib/document.js:1924:15 
    at nextTickCallbackWith0Args (node.js:420:9) 
    at process._tickCallback (node.js:349:13) 

HistoryaddControllerは次のようになります。このコレクションの

.controller('HistoryaddController', function($scope, $cordovaNetwork, $ionicPopup, $rootScope, $filter, $state, $stateParams, Movie, $ionicLoading, $ionicPlatform, $ionicHistory, $http, $timeout) { 

    $scope.loadMovie = function() { 

     $scope.movie = Movie.get({ id: $stateParams.id }).$promise.then(function(results) { 
      console.log(results); 
      $scope.movie = results; 
     }); 
    }; 
    $scope.loadMovie(); 

    $scope.themovie = { 
     details: '', 
    }; 

    $scope.updateMovie = function() { 

     $scope.movie.Histories.push($scope.themovie); 
     $scope.movie.$update(function() { 
      $state.go('movies'); 
     }); 
    }; 
}) 

バックエンドのmongoモデルは次のとおりです。

var mongoose = require('mongoose'); 
var autoIncrement = require('mongoose-auto-increment'); 
mongoose.Promise = global.Promise; 
var connection = mongoose.createConnection("mongodb://localhost:27017/mymongodb"); 
autoIncrement.initialize(connection); 
var Schema = mongoose.Schema; 
var DataSchema = new Schema({ 
    sort: { type: Schema.Types.ObjectId, ref: 'Sort' }, 
    custname: String, 
    problem: String, 
    opendate: { type: Date, default: Date.now }, 
    enddate: { type: Date }, 
    lastupdate: { type: Date }, 
    assignedon: { type: Date }, 
    openby: String, 
    updateby: String, 
    assignedto: String, 
    severity: String, 
    product: String, 
    srstatus: String, 
    reportby: String, 
    custowner: String, 
    vendorid: String, 
    Histories: [{ 
     details: String 
    }] 
}); 

DataSchema.plugin(autoIncrement.plugin, 'Data'); 
module.exports = mongoose.model('Data', DataSchema); 

バックエンドのルートがある:あなたができる場合

var Data = require('../app/models/data'); // get the mongoose model 
var express = require('express'); 

var router = express.Router(); 

router.route('/:id') 
    .put(function(req, res) { 
     Data.findOne({ _id: req.params.id }, function(err, data) { 

      if (err) 
       res.send(err); 

      for (prop in req.body) { 
       data[prop] = req.body[prop]; 
      } 

      // save the movie 
      data.save(function(err) { 
       if (err) 
        res.send(err); 
       res.json({ message: 'Data updated!' }); 
      }); 

     }); 
    }) 
<form name="myForm1"> 
<ion-view title="Add Detail"> 
    <ion-header-bar align-title="center" class="bar-balanced"> 
    <ion-nav-bar align-title="center" class="nav-title-slide-ios7 bar-balanced"> 
     <ion-nav-back-button class="button-icon ion-arrow-left-c"> 
     </ion-nav-back-button> 
    </ion-nav-bar> 
    </ion-header-bar> 

    <ion-content overflow-scroll="true" class="padding"> 
    <div class="list" > 
     <label class="item item-input"> 
     <input type="text" placeholder="customer" ng-model="movie.custname" required> 
     </label> 
     <label class="item item-input"> 
     <input type="text" placeholder="problem" ng-model="movie.problem" required> 
     </label> 
     <label class="item item-input"> 
     <textarea ng-trim="false" rows=8 placeholder="Details" ng-model="themovie.details" required></textarea> 
     </label> 
     </div> 
    <button class="button button-full button-balanced" clicked-disable ng-disabled="myForm1.$invalid" ng-click="updateMovie()"> 
     Add 
    </button> 
    </ion-content> 
</ion-view> 
</form> 

をおくりますp私は何を修正すべきか分からない。私が得る問題は、2つのクライアントアプリ(クライアントapp1とクライアントアプリ2)がこのHistoriesaddページ - >入力レコード - >保存を入力するときです。このエラーが発生します。 client1がこのHistoriesaddページ - >入力レコード - > saveを入力した場合。そして、client2はこのHistoriesaddページ - >入力レコード - > saveを入力します。このエラーは発生しません。つまり、最初のクライアントがレコードを正常に保存するまで、2番目のクライアントはHistroiesaddページに入ることができません。このエラーを回避することができます。私は、それがバックエンドノードの明示的な問題か、フォントの角かどうかわかりません。ありがとう

+0

この追加履歴ページを同時に入力する2人のクライアントから子ローレコード(追加履歴)をプッシュするとエラーが発生します。 1つのクライアントだけ子レコードをプッシュするだけです(つまり、クライアント1にレコードをプッシュするためにヒストリページを追加し、レコードをプッシュするためにヒストリページを追加する)。 angularJSにレコードロック処理が必要ですか? –

+0

この「履歴を追加」ページを同時に入力した2人のクライアントから、子行レコード(履歴を追加)をプッシュするとエラーが発生します。子レコードをクライアントごとに1つだけプッシュするだけです(つまり、クライアント1アプリにレコードをプッシュするためにヒストリページを追加し、クライアント2アプリにレコードをプッシュするためにヒストリページを追加する)。 angularJSにレコードロック処理が必要ですか? –

+0

コードがStack Overflowで実行可能なときにコードスニペットを使用します。それ以外の場合は、コードサンプルの書式設定(インデント4スペース)を使用します。 –

答えて

0

私は問題がここに頼っていると思います。

for (prop in req.body) { 
     data[prop] = req.body[prop]; 
    } 

// save the movie 
data.save(function(err) { 
if (err) 
    res.send(err); 
    res.json({ message: 'Data updated!' }); 
}); 

あなたはそれがすでに再送信された後、クライアントにJSONを再送信しようとしています。保存が完了していることを確認してからjsonに戻ります。 res.jsonをコールバックの外に置くようにしてください

// save the movie 
data.save(function(err) { 
if (err) 
    res.send(err); 
}); 

res.json({ message: 'Data updated!' }); 
+0

私はあなたの提案をres.json({message: 'Data updated!'})コールバック外に置くことを試みます。残念ながら、問題は依然として残っています。 –

+0

res.jsonにコメントし、すべてのres.send(err)をthrow errに置き換えてみてください。何が出力されますか? – digit

+0

下記のように変更されます –

関連する問題