2017-02-08 14 views
0

私はmlabとmongojsをAngularと共に使用しています。ブール値(onStatus)を切り替えようとすると、ビュー内のボタンがオフからオンに切り替わりますが、アプリケーションがクラッシュします。 DBにチェックインすると、プロパティがドキュメントから削除されました。以下のコードスニペット:平均スタックアプリケーション:ブール値を切り替えます

device.service.ts

toggleDevice(updatedStatus){ 
var headers = new Headers(); 
headers.append('Content-Type', 'application/json'); 
return this.http.put('/api/device/'+updatedStatus._id, JSON.stringify(updatedStatus), {headers: headers}) 
    .map(res => res.json()); 
} 

devices.component.ts

toggleDevice(device){ 
var currentStatus = device.onStatus; 
var updatedStatus = { 
    _id: device._id, 
    name: device.name, 
    onStatus: !currentStatus 
}; 

this.deviceService.toggleDevice(updatedStatus) 
    .subscribe(data => { 
    device.onStatus = !device.onStatus 
    }); 

}

devices.compoonents.html

<button class="btn" (click)="toggleDevice(device)" type="button">{{ device.onStatus ? 'Switch Off' : 'Switch On' }}</button> 

APIルーティング

var express = require('express'); 
var router = express.Router(); 
var database = require('../config/database'); 
var mongojs = require('mongojs'); 
var db  = mongojs(database.url, ['devices']) 

// GET : All devices 
router.get('/devices', function(req, res, next){ 
    db.devices.find(function(err, devices){ 
    if(err) { 
     res.send(err); 
    } 
    res.json(devices); 
    }); 
}); 

// GET : Single device 
router.get('/device/:id', function(req, res, next){ 
    db.devices.findOne({_id: mongojs.ObjectId(req.params.id)}, function(err, device){ 
    if(err) { 
     res.send(err); 
    } 
    res.json(device); 
    }); 
}); 

// POST : Save a device 
router.post('/device', function(req, res, next){ 
    var device = req.body; 
    device.onStatus = false; 
    if(!device.name) { 
     res.status(400); 
     res.json({ 
     "error": "Please add a name." 
     }); 
    } else { 
    db.devices.save(device, function(err, device){ 
     if(err) { 
     res.send(err); 
     } 
     res.json(device); 
    }); 
    } 
}); 

// DELETE : A device 
router.delete('/device/:id', function(req, res, next){ 
    db.devices.remove({_id: mongojs.ObjectId(req.params.id)}, function(err, device){ 
    if(err) { 
     res.send(err); 
    } 
    res.json(device); 
    }); 
}); 

// PUT : Update a device 
router.put('/device/:id', function(req, res, next){ 
    var device = req.body; 
    var updatedDevice = {}; 

    if(device.name) { 
    updatedDevice.name = device.name; 
    } 

    if(!updatedDevice){ 
    res.status(400); 
    res.json({'Error': 'Name not specified'}); 
    } else { 
    db.devices.update({_id: mongojs.ObjectId(req.params.id)}, updatedDevice, {}, function(err, device){ 
     if(err) { 
     res.send(err); 
     } 
     res.json(device); 
    }); 
    } 
    db.devices.findOne({_id: mongojs.ObjectId(req.params.id)}, function(err, device){ 
    if(err) { 
     res.send(err); 
    } 
    res.json(device); 
    }); 
}); 

module.exports = router; 

エラー

/home/chopin/Development/homeautomation/node_modules/mongojs/node_modules/mongodb/lib/utils.js:98 
    process.nextTick(function() { throw err; }); 
           ^

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
    at ServerResponse.header (/home/chopin/Development/homeautomation/node_modules/express/lib/response.js:719:10) 
    at ServerResponse.send (/home/chopin/Development/homeautomation/node_modules/express/lib/response.js:164:12) 
    at ServerResponse.json (/home/chopin/Development/homeautomation/node_modules/express/lib/response.js:250:15) 
    at /home/chopin/Development/homeautomation/routes/devices.js:80:9 
    at /home/chopin/Development/homeautomation/node_modules/mongojs/lib/collection.js:50:5 
    at handleCallback (/home/chopin/Development/homeautomation/node_modules/mongojs/node_modules/mongodb/lib/utils.js:95:56) 
    at /home/chopin/Development/homeautomation/node_modules/mongojs/node_modules/mongodb/lib/cursor.js:674:5 
    at handleCallback (/home/chopin/Development/homeautomation/node_modules/mongojs/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:171:5) 
    at nextFunction (/home/chopin/Development/homeautomation/node_modules/mongojs/node_modules/mongodb/node_modules/mongodb-core/lib/cursor.js:682:5) 
[nodemon] app crashed - waiting for file changes before starting... 

任意の助けてくれてありがとう。

EDIT:2回目にボタンを切り替えるときにエラーが発生するだけです。私はこれが何らかの理由でDBから削除されたと仮定しています。 IDの名前とIDは保持されますが、onStatusは保持しません。

EDIT 2:あなたは、互いに独立して、非同期updatefindOne呼び出しをやっているので、res.json()が2回呼び出され、あなたの/device/:idPUTエンドポイント上で完全コードhttps://github.com/Sacki2013/homeAutomation

答えて

0

既に送信された後でも応答を送信しようとしています。あなたの応答が送信された後にreturnステートメントを追加するだけです。

var express = require('express'); 
var router = express.Router(); 
var database = require('../config/database'); 
var mongojs = require('mongojs'); 
var db  = mongojs(database.url, ['devices']) 

// GET : All devices 
router.get('/devices', function(req, res, next){ 
    db.devices.find(function(err, devices){ 
    if(err) { 
     res.send(err); 
     return; 
    } 
    res.json(devices); 
    }); 
}); 

// GET : Single device 
router.get('/device/:id', function(req, res, next){ 
    db.devices.findOne({_id: mongojs.ObjectId(req.params.id)}, function(err, device){ 
    if(err) { 
     res.send(err); 
     return; 
    } 
    res.json(device); 
}); 
}); 

// POST : Save a device 
router.post('/device', function(req, res, next){ 
    var device = req.body; 
    device.onStatus = false; 
    if(!device.name) { 
    res.status(400); 
    res.json({"error": "Please add a name."}); 
    } else { 
    db.devices.save(device, function(err, device){ 
     if(err) { 
     res.send(err); 
     return; 
     } 
     res.json(device); 
    }); 
    } 
}); 

// DELETE : A device 
router.delete('/device/:id', function(req, res, next){ 
    db.devices.remove({_id: mongojs.ObjectId(req.params.id)}, function(err, device){ 
    if(err) { 
     res.send(err); 
     return; 
    } 
    res.json(device); 
}); 
}); 

// PUT : Update a device 
router.put('/device/:id', function(req, res, next){ 
    var device = req.body; 
    var updatedDevice = {}; 

    if(device.name) { 
    updatedDevice.name = device.name; 
    } 

    if(!updatedDevice){ 
    res.status(400); 
    res.json({'Error': 'Name not specified'}); 
    } else { 
    db.devices.update({_id: mongojs.ObjectId(req.params.id)}, updatedDevice, {}, function(err, device){ 
     if(err) { 
     res.send(err); 
     return; 
     } 
     /* 
     * Commenting following line because 
     * you are sending a response in `findOne` 
     */ 
     // res.json(device); 
     db.devices.findOne({_id: mongojs.ObjectId(req.params.id)}, function(err, device){ 
     if(err) { 
      res.send(err); 
      return; 
     } 
     res.json(device); 
     }); 
    }); 
    } 
    }); 

    module.exports = router; 
+0

これは修正されました。さて、updatedDevice.onStatus = device.onStatus;をPUTリクエストに追加してください。ありがとうございました、RETURNステートメントのおかげで – user2682597

+0

確かに、私は満足しています助けるために。 –

0

。 コールバック内でfindOne関数を移動してみてください。

+0

これは間違いの原因です。コードを削除してエラーを取り除きました。私はまだ次のトグルで削除されていないブール値を切り替えることはできません。 – user2682597

+0

私はあなたがすでにそれが働いているのを見ます、そうですか? –

+0

ありがとうございます。私は今働いている。それはソートされたサーバーです。 Cでクライアントを試行する時間:( – user2682597

関連する問題