创建 REST API 以处理来自 Node.js 和 MongoDB 上不同传感器的 JSON 数据

Creating REST API to handle JSON data from different sensors on Node.js & MongoDB

我正在尝试创建一个 REST API 来处理来自传感器(温度计、湿度计)的 JSON 数据,以存储和处理温度和湿度数据。但是目前,我还没有直接从传感器获取数据,所以我计划通过 http GET/POST 请求将虚拟数据从客户端发送到 node.js 服务器。

我正在使用 Node.js 作为服务器,我正在尝试使用 mongoose 保存到 mongodb。

当尝试使用 mvc 设计模式设计此系统时,我最初只尝试制作一个 sensor.model.js & sensor.controller.js 但是当我不得不处理两个不同的传感器数据时出现了问题每个发送其温度数据或湿度数据的地方。所以我不确定我应该如何设计 API。 我假设将 POST 每个传感器数据分别设为 "localhost:3000/sensors/thermometer/" 和 "localhost:3000/sensors/hygromometer/" 是更好的选择。我现在可以成功地将 POST 请求发送到 "localhost:3000/sensors/thermometer/" 和 "localhost:3000/sensors/hygromometer/",但我希望能够发送 GET 方法以从按 sensor_type 排序的“/sensors”中获取所有数据。我怎样才能使这成为可能?有什么好的方法可以想出这个吗?

我把 sensor.js 和 thermometer.js 的代码放在下面。 hydrometer.js和thermometer.js完全一样所以我懒得写了

在此先感谢您。

// sensors.model.js

const mongoose = require('mongoose');

const sensorSchema = new mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    // this method below doesn't work.
    sensor_type: {type: String, ref: 'Hygro'},
    sensor_type: {type: String, ref: 'Thermo'},
    //time : { type : Date, default: Date.now },
    temperature: {type: Number},
    humidity: {type: Number}
});

module.exports = mongoose.model('Sensor', sensorSchema);

//____________________________________________________________________________

// sensors.route.js

router.get('/', (req, res, next) => {
    Sensor.find()
    .select('_id sensor_type temperature humidity')
    .exec()
    .then(docs => {
        res.status(200).json({
          sensors: docs.map(doc => {
            return {
                _id: doc._id,
                sensor_type: doc.sensor_type,
                temperature: doc.temperature,
                humidity: doc.humidity + "%"
                }
          })
        });
    })
    .catch(err => {
        res.status(500).json({
          error : err
        });
    });

//___________________________________________________________________________


// thermometer.model.js

const mongoose = require('mongoose');

const thermoSchema = new mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    sensor_type: {type: String, required: true},
    temperature: {type: Number, required: true}
});

module.exports = mongoose.model('Thermo', thermoSchema);

//___________________________________________________________________________


// thermometer.route.js

router.post('/', (req, res, next) => {
    // create sensor object
    const thermo = new Thermo({
      _id: new mongoose.Types.ObjectId(),
      sensor_type: req.body.sensor_type,
      temperature: req.body.temperature
    });
    //save thermo obj into the db
    thermo
    .save()
    .then(result => {
      console.log(result);
      res.status(201).json({
        message: 'Created sensor data successfully',
        createdSensor_data: {
          sensor_type: result.sensor_type,
          temperature: result.temperature,
          _id: result._id
        }
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
          error: err
      });
    });
}

传感器可以同时存储湿度和温度吗? 如果不是那么设计可能很简单:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const sensorSchema = new Schema({
    _id: Schema.Types.ObjectId,
    type: {
      type: String,
      required: true,
      enum: ['Hydro', 'Thermo']
    },
    //time : { type : Date, default: Date.now },
    // for the time I use mongoose built in { timestamps: true }
    // temperature: {type: Number},
    // humidity: {type: Number}
    // store value instead. if it's type 'Hydro' you know it's humidity
    value: {
      type: Number,
      required: true
    }
}, { timestamps: true } );
// timestamps: true gives you createdAt and updatedAt automatically

module.exports = mongoose.model('Sensor', sensorSchema);

获取所有传感器

// sensors.route.js

router.get('/', (req, res, next) => {
  Sensor.find()
    .select()
    .exec()
    .then(result => {
      res.status(200).json({
        sensors: result.map(item => {
          return item._doc
        })
      });
    })
    .catch(err => {
      res.status(500).json({
        error: err
      });
    });
})

对于post请求

router.post('/', (req, res, next) => {
  // create sensor object
  const sensor = new Sensor({
    // _id: new mongoose.Types.ObjectId(), 
    // you dont new to add _id, Mongoose adds it by default
    type: req.body.sensor_type,
    value: req.body.temperature
  });
  //save it
  sensor
  .save()
  .then(result => {
    console.log(result);
    res.status(201).json({
      message: 'Created sensor data successfully',
      createdSensor_data: result._doc // you can access the data on the _doc property
    });
  })
  .catch(err => {
    console.log(err);
    res.status(500).json({
        error: err
    });
  });
})

我还会验证 req.body 数据,如果没有则抛出错误。