我正在设置一台新服务器,并创建了一个名为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"
}


有人经历过这个吗?

最佳答案

原来是正则表达式,出于某种原因,它不能与多个Image一起使用...这很奇怪,因为它们分别进行了验证。

新的正则表达式为:

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

10-08 15:16