npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

hmve

v1.1.2

Published

Handle mongoose validation error with custom and localize messages

Downloads

10

Readme

HMVE

Handle mongoose validation error with custom and localize messages

What ?


Mongoose has schema validation, but its error message isn't user-friendly, example :

schema : fullName : { type : String, minlength : 3 }
data   : fullName : 'Bi'

Will generate error message :

Path `fullName` (`Bi`) is shorter than the minimum allowed length (3).

With hmve, you can custom error message, like :

Full name must be at least 3 characters long

and localize :

(Vietnamese) Họ tên phải dài ít nhất 3 kí tự

Config

Let's view simple config file, for :

Use

Add path names

  • For single language, just add $name to mongoose Schema :

      username : { type : String, required : true, unique : true, $name : 'tên tài khoản' },

    If $name not specific, hmve will use path ('username')

  • For multi language, use setPathNames() with language package name

    hmve.setPathNames(UserModel, { username : 'tên tài khoản', address : { country : 'quốc gia' } }, 'vi');
    hmve.setPathNames(UserModel, { username : 'ユーザー名'    , address : { country : '国'       } }, 'jpa');

Handle error

hmve only handle mongoose validation error, other error type will be return directly.

On mongoose document validate()

Cann't handle unique error.

let user = UserModel({ username : 'boo' });
user.validate(err => {
  err = hmve(UserModel, err);
  if (err) {
      return res.status(400).json({ error : err.message });
    }
  }
});

On mongoose model write method like create(), findOneAndUpdate(), ...

Can handle unique error.

UserModel
  .create({ username : 'boo' })
  .then(user => res.json(user))
  .catch(err => {
    err = hmve(UserModel, err);
    // you can change error code in config()
    if (err.code === 'ERR_MONGOOSE_VALIDATION') { 
      return res.status(400).json({ error : err.message });
    }
    return res.status(500).json({ error : `ERROR DB ${err.message}` });
  });

List error kinds and their context variables

Use this to write custom message templates

| KIND | CONTEXT VARIABLE | |----- | ---------------- | | * | PATH, PATH_NAME, VALUE | | type | TYPE, TYPE_NAME, STRING_VALUE | | min | MIN | | max | MAX | | minlength | MIN_LENGTH | | maxlength | MAX_LENGTH | | regexp | | | enum | ENUM_VALUES, STRING_ENUM_VALUES | | validate | | | unique | |

Error Object

{
   "message"    : "Birthday must be a date, Username is required, Full name must be at least 3 characters long",
   "messages"   : [
     "Birthday must be a date",
     "Username is required",
     "FullName must be at least 3 characters long"
   ],
   "name"       : "ValidationError",
   "code"       : "ERR_MONGOOSE_VALIDATION",
   "model_name" : "Users",
   "pack"       : "DEFAULT",
   "errors"     : [
     {
       "message"      : "Birthday must be a date",
       "context"      : {
         "KIND"         : "type",
         "PATH_NAME"    : "birthday",
         "PATH"         : "birthday",
         "TYPE"         : "Date",
         "TYPE_NAME"    : "date",
         "VALUE"        : "is a date?",
         "STRING_VALUE" : "\"is a date?\""
       },
       "template"     : "{PATH_NAME} must be a {TYPE_NAME}"
     },
     {
       "message"      : "Username is required",
       "context"      : {
         "KIND"         : "required",
         "PATH_NAME"    : "username",
         "PATH"         : "username"
       },
       "template"     : "{PATH_NAME} is required"
     },
     {
       "message"      : "Full name must be at least 3 characters long",
       "context"      : {
         "KIND"         : "minlength",
         "PATH_NAME"    : "full name",
         "PATH"         : "fullName",
         "VALUE"        : "Bi",
         "MIN_LENGTH"   : 3
       },
       "template"     : "{PATH_NAME} must be at least {MIN_LENGTH} characters long"
     }
   ],
}

API LIST

| API | Description | | --- | --- | |hmve(model, validationError, [options])|Handle mongoose validation error| |validate(doc, [options])|Validate mongoose document, handle error with hmve| |setMessageTemplates(messageTemplate, [packageName])|Set message template for a package| |setTypeNames(typeNames, [packageName])|Set type names for a package| |setPathNames(model, pathNames, [packageName])|Set path names for a package| |config(options)|Config|

Handler

hmve(model, validationError, [options]) ⇒ Object

Handle only mongoose validation error, other error type will be return directly.

Returns: Object - user-friendly error

| Param | Type | Description | | --- | --- | --- | | model | Object | Mongoose model object or name | | validationError | Object | Mongoose validation error | | [options] | Object | options |

Options

| field | Type | Description | Example | | --- | --- | --- | --- | | package | String | Language package name. Default is config.default_package. Must be provide in multi language mode. | 'vi', 'jp' | | exclude_errors | String|Array | One or more error kinds will be excluded. Ex: exclude 'required' error when validating update data. | 'required', ['required, 'unique'] |

Example

const hmve = require('hmve');

const UsersSchema = new Schema({
  username : { type : String, required : true                    },
  fullName : { type : String, minlength : 3, $name : 'full name' },
  birthday : { type : Date  ,                                    },
});

const UsersModel = mongoose.model('Users', UsersSchema, 'Users');

let user = UsersModel({
  fullName : 'Bi',
  birthday : 'is a date?',
});

user.validate(err => {
  err = hmve(UsersModel, err);
  if (err) {
     res.status(400).json(err.message); 
     // Birthday must be a date, Username is required, Full name must be at least 3 characters long
  }
});

validate(doc, [options]) ⇒ object

Validate mongoose document, handle error with hmve. This just a convenience syntax with async/await.

Returns: object - user-friendly error

| Param | Type | Description | | --- | --- | --- | | doc | Object | mongoose document | | [options] | Object | same as hmve() options|

Example

const hmve = require('hmve');

const UsersSchema = new Schema({
  username : { type : String, required : true                    },
  fullName : { type : String, minlength : 3, $name : 'full name' },
  birthday : { type : Date  ,                                    },
});

const UsersModel = mongoose.model('Users', UsersSchema, 'Users');

let user = UsersModel({
  fullName : 'Bi',
  birthday : 'is a date?',
});

let err = await hmve.validate(user);
if (err) {
   res.status(400).json(err.message); 
   // Birthday must be a date, Username is required, Full name must be at least 3 characters long
}

Setter

setMessageTemplates(messageTemplate, [packageName])

Set message template for a package

See: getMessageTemplates('DEFAULT') to view default message template

| Param | Type | Description | | --- | --- | --- | | messageTemplate | Object | { <error_kind> : <message_template> } | | [packageName] | String | Package name, ex: 'en', 'vi', 'jp' |

Example

hmve.setMessageTemplates({ 
  DEFAULT   : '{PATH_NAME} không hợp lệ',
  type      : '{PATH_NAME} phải là {TYPE_NAME}',
  required  : 'Thiếu thông tin {PATH_NAME}',
  min       : '{PATH_NAME} không được nhỏ hơn {MIN}',
  max       : '{PATH_NAME} không được lớn hơn {MAX}',
  minlength : '{PATH_NAME} dài ít nhất {MIN_LENGTH} kí tự',
  maxlength : '{PATH_NAME} không vượt quá {MAX_LENGTH} kí tự',
  enum      : '{PATH_NAME} phải thuộc một trong các giá trị sau : {STRING_ENUM_VALUES}',
  regex     : '{PATH_NAME} không hợp lệ',
  unique    : '{PATH_NAME} {VALUE} đã được sử dụng, vui lòng chọn {PATH_NAME} khác',
}, 'vi');

setTypeNames(typeNames, [packageName])

Set type names for a package

See: getTypeNames('DEFAULT') to view default type names

| Param | Type | Description | | --- | --- | --- | | typeNames | Object | { : <type_name> } | | [packageName] | String | Package name, ex: 'en', 'vi', 'jp' |

Example

hmve.setTypeNames({ 
  number  : 'số',
  boolean : 'luận lý',
  date    : 'ngày',
  string  : 'chuỗi',
  array   : 'mảng',
  object  : 'đối tượng',
  buffer  : 'bộ nhớ đệm',
}, 'vi');

setPathNames(model, pathNames, [packageName])

Set path names for a package

| Param | Type | Description | | --- | --- | --- | | model | Object | String | mongoose model or model name | | pathNames | Object | { : <path_name> }, which has the same structure as Mongoose Schema | | [packageName] | String | package name, ex: 'en', 'vi' |

Example

hmve.setPathNames('User', {
   username : 'tên tài khoản',
   age      : 'tuổi',
   address  : {
     country : 'quốc gia',
     province : 'tỉnh thành'
   }
}, 'vi');

config(options)

set options

| Param | Type | Description | | --- | --- | --- | | options | Object | options |

Example

hmve.config({
   default_package           : 'DEFAULT',
   msg_delimiter             : ', ',
   path_name_key             : '$name',
   link_to_errors            : 'errors',
   upper_first               : true,
   link_to_origin_error      : false,
   additional_error_fields   : {
     error_name                : 'ValidationError',
     error_code                : 'ERR_MONGOOSE_VALIDATION',
    },
   additional_context_fields : {
     // <context_key> : <schema_key>
   }
});