我正在设置一台新服务器,并创建了一个名为Announcement的猫鼬模型,该模型具有一系列名为Image的子文档。每当我向创建物发送多个子文档时,它都会通过验证,检查图像的url
是否正则表达式。有时对于第二个子文档,它可能会失败,有时对于第一个子文档,它会失败。
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)
如果我尝试通过以下方式创建公告:
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()
它按预期工作。
但是,如果我尝试创建:
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()
我得到:
{
"images.1.url": "Invalid url"
}
有人经历过这个吗?
答案 0 :(得分:1)
原来是正则表达式,出于某种原因,它不能与多个Image一起使用...这很奇怪,因为它们分别进行了验证。
新正则表达式为:
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/