You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							151 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
	
	
							151 lines
						
					
					
						
							3.4 KiB
						
					
					
				'use strict';
 | 
						|
 | 
						|
/*!
 | 
						|
 * Module dependencies.
 | 
						|
 */
 | 
						|
 | 
						|
const MongooseError = require('./mongooseError');
 | 
						|
const get = require('../helpers/get');
 | 
						|
const util = require('util');
 | 
						|
 | 
						|
/**
 | 
						|
 * Casting Error constructor.
 | 
						|
 *
 | 
						|
 * @param {String} type
 | 
						|
 * @param {String} value
 | 
						|
 * @inherits MongooseError
 | 
						|
 * @api private
 | 
						|
 */
 | 
						|
 | 
						|
class CastError extends MongooseError {
 | 
						|
  constructor(type, value, path, reason, schemaType) {
 | 
						|
    // If no args, assume we'll `init()` later.
 | 
						|
    if (arguments.length > 0) {
 | 
						|
      const stringValue = getStringValue(value);
 | 
						|
      const valueType = getValueType(value);
 | 
						|
      const messageFormat = getMessageFormat(schemaType);
 | 
						|
      const msg = formatMessage(null, type, stringValue, path, messageFormat, valueType);
 | 
						|
      super(msg);
 | 
						|
      this.init(type, value, path, reason, schemaType);
 | 
						|
    } else {
 | 
						|
      super(formatMessage());
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  toJSON() {
 | 
						|
    return {
 | 
						|
      stringValue: this.stringValue,
 | 
						|
      valueType: this.valueType,
 | 
						|
      kind: this.kind,
 | 
						|
      value: this.value,
 | 
						|
      path: this.path,
 | 
						|
      reason: this.reason,
 | 
						|
      name: this.name,
 | 
						|
      message: this.message
 | 
						|
    };
 | 
						|
  }
 | 
						|
  /*!
 | 
						|
   * ignore
 | 
						|
   */
 | 
						|
  init(type, value, path, reason, schemaType) {
 | 
						|
    this.stringValue = getStringValue(value);
 | 
						|
    this.messageFormat = getMessageFormat(schemaType);
 | 
						|
    this.kind = type;
 | 
						|
    this.value = value;
 | 
						|
    this.path = path;
 | 
						|
    this.reason = reason;
 | 
						|
    this.valueType = getValueType(value);
 | 
						|
  }
 | 
						|
 | 
						|
  /*!
 | 
						|
   * ignore
 | 
						|
   * @param {Readonly<CastError>} other
 | 
						|
   */
 | 
						|
  copy(other) {
 | 
						|
    this.messageFormat = other.messageFormat;
 | 
						|
    this.stringValue = other.stringValue;
 | 
						|
    this.kind = other.kind;
 | 
						|
    this.value = other.value;
 | 
						|
    this.path = other.path;
 | 
						|
    this.reason = other.reason;
 | 
						|
    this.message = other.message;
 | 
						|
    this.valueType = other.valueType;
 | 
						|
  }
 | 
						|
 | 
						|
  /*!
 | 
						|
   * ignore
 | 
						|
   */
 | 
						|
  setModel(model) {
 | 
						|
    this.model = model;
 | 
						|
    this.message = formatMessage(model, this.kind, this.stringValue, this.path,
 | 
						|
      this.messageFormat, this.valueType);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
Object.defineProperty(CastError.prototype, 'name', {
 | 
						|
  value: 'CastError'
 | 
						|
});
 | 
						|
 | 
						|
function getStringValue(value) {
 | 
						|
  let stringValue = util.inspect(value);
 | 
						|
  stringValue = stringValue.replace(/^'|'$/g, '"');
 | 
						|
  if (!stringValue.startsWith('"')) {
 | 
						|
    stringValue = '"' + stringValue + '"';
 | 
						|
  }
 | 
						|
  return stringValue;
 | 
						|
}
 | 
						|
 | 
						|
function getValueType(value) {
 | 
						|
  if (value == null) {
 | 
						|
    return '' + value;
 | 
						|
  }
 | 
						|
 | 
						|
  const t = typeof value;
 | 
						|
  if (t !== 'object') {
 | 
						|
    return t;
 | 
						|
  }
 | 
						|
  if (typeof value.constructor !== 'function') {
 | 
						|
    return t;
 | 
						|
  }
 | 
						|
  return value.constructor.name;
 | 
						|
}
 | 
						|
 | 
						|
function getMessageFormat(schemaType) {
 | 
						|
  const messageFormat = get(schemaType, 'options.cast', null);
 | 
						|
  if (typeof messageFormat === 'string') {
 | 
						|
    return messageFormat;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/*!
 | 
						|
 * ignore
 | 
						|
 */
 | 
						|
 | 
						|
function formatMessage(model, kind, stringValue, path, messageFormat, valueType) {
 | 
						|
  if (messageFormat != null) {
 | 
						|
    let ret = messageFormat.
 | 
						|
      replace('{KIND}', kind).
 | 
						|
      replace('{VALUE}', stringValue).
 | 
						|
      replace('{PATH}', path);
 | 
						|
    if (model != null) {
 | 
						|
      ret = ret.replace('{MODEL}', model.modelName);
 | 
						|
    }
 | 
						|
 | 
						|
    return ret;
 | 
						|
  } else {
 | 
						|
    const valueTypeMsg = valueType ? ' (type ' + valueType + ')' : '';
 | 
						|
    let ret = 'Cast to ' + kind + ' failed for value ' +
 | 
						|
      stringValue + valueTypeMsg + ' at path "' + path + '"';
 | 
						|
    if (model != null) {
 | 
						|
      ret += ' for model "' + model.modelName + '"';
 | 
						|
    }
 | 
						|
    return ret;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/*!
 | 
						|
 * exports
 | 
						|
 */
 | 
						|
 | 
						|
module.exports = CastError;
 |