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?