MEAN Stack应用程序:切换布尔值

时间:2017-02-08 19:58:19

标签: javascript angularjs node.js mongoose mongojs

我正在使用mlab和mongojs以及Angular。当我尝试切换布尔值(onStatus)时,视图中的按钮从关闭切换为打开,但它会使应用程序崩溃。当我签入数据库时​​,该属性已从文档中删除。下面的代码片段:

device.service.ts

[Run]
Filename: "pip.exe"; Parameters: "install requests"; StatusMsg: "Installing requests..."

devices.component.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.compoonents.html

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
  });

API路由

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

错误

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;

感谢您的帮助。

编辑:我应该提到错误只发生在我第二次切换按钮时。我假设因为某些原因已经从DB中删除了。名称和ID仍然存在,但onStatus没有。

编辑2:完整代码https://github.com/Sacki2013/homeAutomation

2 个答案:

答案 0 :(得分:0)

/device/:id PUT个终端上,您异步执行updatefindOne个调用,彼此独立,因此调用了res.json()两次。尝试在findOne回调中移动update功能。

答案 1 :(得分: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;