node.js - 发送多个子文档时 Mongoose 验证失败

标签 node.js regex express mongoose subdocument

我正在设置一个新服务器,并创建了一个名为“Announcement”的 Mongoose 模型,其中包含一组名为“Image”的子文档。每当我向创建的内容发送超过 1 个子文档时,检查图像的 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"
}

有人经历过这种情况吗?

最佳答案

结果是正则表达式,由于某种原因它不能处理多个图像......这很奇怪,因为它们是单独验证的。

新的正则表达式是:

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

关于node.js - 发送多个子文档时 Mongoose 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57298192/

相关文章:

javascript - fetch() 对 Express.js 的 POST 请求生成空正文 {}

javascript - Bootstrap 轮播在哈巴狗中无法滑动

javascript - Express.js 路由。如何将默认路由放在所有现有路由之前

java - 检查字符串是否包含特定字符的模式

javascript - 尝试获取 json 数据,出现 "not a function"错误

node.js - 如何在 Express 中设置具有任意起始路径的静态服务?

node.js - 需要有关如何将 Postman 的 Newman 与 Nodejs 结合使用的示例吗?

node.js - 如何使用从浏览器发送到Nodejs服务器的Blob进行Google语音文本转换

javascript - 如何使用正则表达式匹配字符串中的单词并对每个匹配执行特定任务

regex - 只匹配唯一出现的字符串