1

I'm setting up a new server and I've created a mongoose Model named Announcement, that has an array of sub-documents named Image. Whenever I send more than 1 subdocument to the creation, it fails the validation that checks if the image's url mathes the regex. Sometimes it fails for the second sub-document, and sometimes for the first.

regex.js:

export const EMAIL_REGEX = /^(([^<>()\[\]\\.,:\s@"]+(\.[^<>()\[\]\\.,:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
export const FULL_NAME_REGEX = /^[A-Za-zÀ-ÖØ-öø-ÿ]+(([',. -][A-Za-zÀ-ÖØ-öø-ÿ ])?[A-Za-zÀ-ÖØ-öø-ÿ]*)*$/
export const URL_REGEX = /(https?:)?\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_+.~#?&\/=]*)/gi

image.js:

import mongoose from 'mongoose'

import { URL_REGEX } from '../../../config/regex'

const ImageSchema = new mongoose.Schema({
  url: {
    type: String,
    required: [true, 'Url is required'],
    match: [URL_REGEX, 'Invalid url']
  },
  alt: {
    type: String,
    required: [true, 'Alt is required']
  }
})

export default ImageSchema

announcement.js:

import mongoose        from 'mongoose'
import uniqueValidator from 'mongoose-unique-validator'

import ImageSchema         from './image'
import { FULL_NAME_REGEX } from '../../../config/regex'

const AnnouncementSchema = new mongoose.Schema({
  author: {
    type: String,
    required: [true, 'Author is required'],
    match: [FULL_NAME_REGEX, 'Invalid name']
  },
  title: {
    type: String,
    required: [true, 'Title is required']
  },
  content: {
    type: String,
    required: [true, 'Content is required']
  },
  images: {
    type: [ImageSchema],
    default: []
  },
  createdAt: {
    required: true,
    type: Date
  },
  updatedAt: {
    required: true,
    type: Date
  }
})

ModelSchema.plugin(uniqueValidator, {
  message: '{PATH} ({VALUE}) needs to be unique'
})

AnnouncementSchema.pre('validate', function(next) {
  const date = new Date()

  if (this.isNew) {
    this.createdAt = date
  }

  this.updatedAt = date

  next()
})

export default mongoose.model('announcements', AnnouncementSchema)

If I try to create an announcement with:

new Announcement({
  author: "John Doe",
  title: "Lorem Ipsum",
  content: "Lorem ipsum dolor sit amet",
  images: [{
    url: "http://google.com/image1.jpg",
    alt: "Image description"
  }]
}).save()

It works as expected.

But if I try to create with:

new Announcement({
  author: "John Doe",
  title: "Lorem Ipsum",
  content: "Lorem ipsum dolor sit amet",
  images: [{
    url: "http://google.com/image1.jpg",
    alt: "Image description"
  }, {
    url: "http://google.com/image2.jpg",
    alt: "Image description"
  }]
}).save()

I get:

{
  "images.1.url": "Invalid url"
}

Has anybody been through this?

tripleee
  • 175,061
  • 34
  • 275
  • 318

1 Answers1

1

Turned out to be the regex, for some reason it wasn't working with multiple Images... That's weird, since they're validated separately.

The new regex is:

/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/