我想知道是否可以在更新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的正常行为。
对于create方法我创建了验证字段的函数:
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}
}
此功能在创建时工作正常,但在更新中我想要只保存请求中发送的字段,而不是所有字段。
我不想对更新的验证进行硬编码。
我正在阅读mongodb 4.0版本中有一个选项runvalidators。这个选项可以进行我需要的验证。
我只能使用稳定版本(客户端要求),我使用的是Mongodbd 3.4.2和mongoose 4.8.3。
有一种方法可以使用mongoose在mongodb的更新方法中动态验证请求正文中发送的字段。
答案 0 :(得分:0)
我混淆了mongoose和mongodb验证方法。使用选项
runvalidators:true
在更新方法中,我得到了我需要的验证。
batchController.update = (id, batch, options, callback) => {
var query = {_id: id};
var update = batch;
var options = { runValidators: true };
Batch.findOneAndUpdate(query, update, options, callback);
}
现在我想知道If是否可以从这种类型的验证中自定义错误消息。