Как генерировать слаг каждый раз, когда статья создается и сохраняется в базе данных? - PullRequest
1 голос
/ 18 января 2020

Итак, у меня есть articleSchema , в котором я хочу создать уникальный слаг.

const mongoose = require("mongoose")
const Schema = mongoose.Schema
var URLSlug = require('mongoose-slug-generator')

const articleSchema = new Schema({
    title: { type: String, required: true },
    description: { type: String, required: true },
    userId: { type: Schema.Types.ObjectId, ref: "User" },
    slug: { type: "String", slug: "title", unique: true }
}, { timestamps: true })


articleSchema.pre("save", function(next) {
    this.slug = this.title.split(" ").join("-")
    next()
})

articleSchema.plugin(URLSlug("title", {field: "Slug"}))

const Article = mongoose.model("Article", articleSchema)

module.exports = Article

Вот articleController

    newArticle: (req, res) => {
        Article.create(req.body, (err, newArticle) => {
            if (err) {
                return res.status(404).json({ error: "No article found" })
            } else {
                return res.status(200).json({ article: newArticle })
            }
        })
    }

Не знаю, когда я проверяю это в почтальоне, он говорит, что статья не найдена, не говоря уже о слизняке! Также я получаю эту ошибку:

schema.eachPath is not a function

1 Ответ

1 голос
/ 18 января 2020

В соответствии с mon goose -slug-generator вам нужно применить плагин к mon goose, но в вашем коде он применяется к схеме.

Так что если попробуйте этот код, он будет работать:

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
var URLSlug = require("mongoose-slug-generator");

mongoose.plugin(URLSlug);

const articleSchema = new Schema(
  {
    title: { type: String, required: true },
    description: { type: String, required: true },
    userId: { type: Schema.Types.ObjectId, ref: "User" },
    slug: { type: String, slug: "title"}
  },
  { timestamps: true }
);

articleSchema.pre("save", function(next) {
  this.slug = this.title.split(" ").join("-");
  next();
});

const Article = mongoose.model("Article", articleSchema);

module.exports = Article;

Если мы отправим req.body следующим образом:

{
    "title": "metal head dev",
    "userId": "5e20954dc6e29d1b182761c9",
    "description": "description"
}

Сохраненный документ будет выглядеть так (как вы видите слаг генерируется правильно):

{
    "_id": "5e23378672f10f0dc01cae39",
    "title": "metal head dev",
    "description": "description",
    "createdAt": "2020-01-18T16:51:18.445Z",
    "updatedAt": "2020-01-18T16:51:18.445Z",
    "slug": "metal-head-dev",
    "__v": 0
}

Кстати, mongoose-slug-generator кажется довольно старым, есть более популярный и хорошо поддерживаемый slugify пакет.

...