The product's slug is created when I post a product. But the slug did not update when I changed the product name.
Here is my code:
const mongoose = require('mongoose');
const { default: slugify } = require('slugify');
const ProductSchema = new mongoose.Schema(
{
name: {
type: String,
trim: true,
unique: true,
required: [true, 'Please add product name'],
},
slug: String,
sku: {
type: String,
trim: true,
required: [true, 'Please add product sku'],
},
isActive: {
type: Boolean,
default: true,
},
createdAt: {
type: Date,
default: Date.now,
},
updatedAt: {
type: Date,
default: Date.now,
},
},
{
toJSON: { virtuals: true },
toObject: { virtuals: true },
}
);
ProductSchema.pre('save', function (next) {
this.slug = slugify(this.name, { lower: true });
next();
});
module.exports = mongoose.model('Prduct', ProductSchema );
I want to update the slug automatically when the name is changed
You can use virtuals for this. Delete the property on the schema and use this instead:
ProductSchema.virtual('slug').get(function() {
return slugify(this.name, { lower: true });
});
The property will not actually exist in the database and will be dynamically determined based on whatever the current name is.