Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose的自定义验证错误_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js mongoose的自定义验证错误

Node.js mongoose的自定义验证错误,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我想知道当我尝试更新文档时,是否可以自定义mongoose中的验证错误 我收到以下验证错误: { "err": { "errors": { "batch_number": { "message": "Path `batch_number` is required.", "name": "ValidatorError", "properties": { "type": "required",

我想知道当我尝试更新文档时,是否可以自定义mongoose中的验证错误

我收到以下验证错误:

{
  "err": {
    "errors": {
      "batch_number": {
        "message": "Path `batch_number` is required.",
        "name": "ValidatorError",
        "properties": {
          "type": "required",
          "message": "Path `{PATH}` is required.",
          "path": "batch_number",
          "value": ""
        },
        "kind": "required",
        "path": "batch_number",
        "value": ""
      }
    },
    "message": "Validation failed",
    "name": "ValidationError"
  }
}
我想回应这样的错误

{
    "errors": {
      "batch_number": "Cannot be null or empty"
      }
}
我的模型定义:

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},
},
{
  timestamps: true
});

const Batch = module.exports = mongoose.model('batches',batchSchema);
如果在其他字段中出现更多错误,则响应必须为:

{
    "errors": {
      "batch_number": "Cannot be null or empty",
      "start_date_time": "must be a date"
      }
}
提前谢谢

更新:

我听从安德烈的建议,得到了同样的错误信息

const express = require('express')
Batch = require('./../../database/controllers/production/batches');

function mongooseErrorHandler (err, req, res, next) {
    if (err.errors) {
      console.log(err);
        const error = {};
        const keys = Object.keys(err.errors);

        keys.forEach((key) => {
            let message = err.errors[key].message;

            if (err.errors[key].properties && err.errors[key].properties.message) {
                message = err.errors[key].properties.message.replace('`{PATH}`', key);
            }

            message = message.replace('Path ', '').replace(key,'').trim();
            error[key] = message;
        });
        return res.status(500).json(error);
        //return next(error);
    }

    next();
};

module.exports = function(app){
  app.put('/api/batches/:_id',mongooseErrorHandler,(req, res, err) => {
      var id = req.params._id;
      var batch = req.body;
      Batch.update(id, batch,{}, (err, batch) => {
          res.status(200).json(batch);
      });
  });
}

您应该创建一个中间件来处理mongoose错误:

function mongooseErrorHandler (err, req, res, next) {
    if (err.errors) {
        const error = {};
        const keys = Object.keys(err.errors);

        keys.forEach((key) => {
            let message = err.errors[key].message;

            if (err.errors[key].properties && err.errors[key].properties.message) {
                message = err.errors[key].properties.message.replace('`{PATH}`', key);
            }

            message = message.replace('Path ', '').replace(key,'').trim();
            error[key] = message;
        });

        return res.status(500).json(error); // or return next(error);
    }

    next();
};
并将其添加到您的路线中。例如:

router.get('/batch', mongooseErrorHandler, (req, res, err) =>{
    ...
});
或者,如果您正在中间件中使用
next(err)

router.get('/batch', mongooseErrorHandler, (req, res, err) =>{
    if (err) res.status(500).json(err);
    ...
});

您应该创建一个中间件来处理mongoose错误:

function mongooseErrorHandler (err, req, res, next) {
    if (err.errors) {
        const error = {};
        const keys = Object.keys(err.errors);

        keys.forEach((key) => {
            let message = err.errors[key].message;

            if (err.errors[key].properties && err.errors[key].properties.message) {
                message = err.errors[key].properties.message.replace('`{PATH}`', key);
            }

            message = message.replace('Path ', '').replace(key,'').trim();
            error[key] = message;
        });

        return res.status(500).json(error); // or return next(error);
    }

    next();
};
并将其添加到您的路线中。例如:

router.get('/batch', mongooseErrorHandler, (req, res, err) =>{
    ...
});
或者,如果您正在中间件中使用
next(err)

router.get('/batch', mongooseErrorHandler, (req, res, err) =>{
    if (err) res.status(500).json(err);
    ...
});

我听从了你的建议,得到了同样的结果。我想我在尝试实施您的解决方案时出错了。看到UpdateThaks它的工作我犯了一个错误,当我修复它的中间件功能工作良好,我按照你的建议,我得到了同样的结果。我想我在尝试实施您的解决方案时出错了。看看UpdateThaks它的工作我犯了一个错误,当我修复它的中间件功能工作良好