【问题标题】:MongoDB Dynamically validate field in updateMongoDB动态验证更新中的字段
【发布时间】:2017-09-09 22:24:25
【问题描述】:

我想知道是否可以在更新 MongoDB 中的记录之前验证来自表单的请求。

型号:

const mongoose = require('mongoose');
const Schema =  mongoose.Schema;

const batchSchema = Schema({
  batch_number:{type: String, required: true},
  work_order_id:{ type: Schema.Types.ObjectId, ref: 'work_orders' ,required: true},
  start_date_time:{type: Date, required: true},
  end_date_time:{type: Date},
  status:{type: String},
  //create_date:{type: Date, default: Date.now}
},
{
  timestamps: true
});

const Batch = module.exports = mongoose.model('batches',batchSchema);

我的控制器:

const mongoose = require("mongoose");
const Batch = require('../../models/production/batch');
const batchController = {};

batchController.index = (callback, limit) => {
  Batch.find(callback).limit(limit)
                      .lean(true)
                      .populate('work_order_id');
};

batchController.show = (id, callback) => {
  var query = {_id: id};
  Batch.findById(query,callback)
        .lean(true)
        .populate('work_order_id');
}

batchController.insert = (batch, callback) => {
  Batch.create(batch,callback);
}

batchController.update = (id, batch, options, callback) => {
  var query = {_id: id};
  var update = batch;
  Batch.findOneAndUpdate(query, update, options, callback);
}

batchController.remove = (id, callback) => {
  var query = {_id: id};
  Batch.remove(query, callback);
}

module.exports = batchController;

我的路线(仅供更新):

  app.put('/api/batches/:_id',(req, res) => {
      var id = req.params._id;
      var batch = req.body;
      Batch.update(id, batch,{}, (err, batch) => {
        if (err){
          res.status(500).json({msg:"Error en aplicacion",err});
        }
         res.status(200).json(batch);
      });
  });

在 create 方法中模型验证字段,但在更新中,mongoose 或 mongodb 不验证数据。

我不知道这是我在模型或控制器的定义中犯的错误,还是这是 mongodb 和 mongoose 的正常行为。

对于创建方法,我创建函数来验证字段:

function validation(data){
  let errors = {};

  if (!data.batch_number) errors.batch_number = "No puede ser nulo";
  if (!data.work_order_id) errors.work_order_id = "No puede ser nulo";
  if (!data.start_date_time) errors.start_date_time = "No puede ser nulo";
  if (!data.status) errors.status = "No puede ser nulo";

  if (data.batch_number === '') errors.batch_number = "No puede ser vacio";
  if (data.work_order_id === '') errors.work_order_id = "No puede ser vacio";
  if (data.start_date_time === '') errors.start_date_time = "No puede ser vacio";
  if (data.status === '') errors.status = "No puede ser vacio";

  const isValid = Object.keys(errors).length === 0;
  return {errors, isValid}
}

这个函数在创建时工作正常,但在更新中我只想保存请求中发送的字段,而不是所有字段。

我不想对更新的验证进行硬编码。

我正在阅读 4.0 版的 mongodb 有一个选项 runvalidators。这个选项会做我需要的验证。

我只能使用稳定版(客户端要求),我使用的是 Mongodbd 3.4.2 和 mongoose 4.8.3。

有一种方法可以使用 mongoose 在 mongodb 的更新方法中动态验证请求正文中发送的字段。

【问题讨论】:

  • 您需要确保所有验证都在客户端完成,并且只有在数据有效时才将数据发送到服务器。这样可以减少服务器处理时间。
  • @Prasanthchinja:即使你有客户端验证,你仍然有服务器验证。因为您的客户端不仅是可以调用您的服务器的客户端(例如:Jmeter、Postman ...)

标签: node.js mongodb express mongoose


【解决方案1】:

我混淆了 mongoose 和 mongodb 验证方法。使用选项

运行验证器:真

在更新方法中,我得到了我需要的验证。

batchController.update = (id, batch, options, callback) => {
  var query = {_id: id};
  var update = batch;
  var options = { runValidators: true };
  Batch.findOneAndUpdate(query, update, options, callback);
}

现在我想知道是否可以通过此类验证自定义错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-09
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多