You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用TypeScript和Mongoose生成唯一的slug?

解决TypeScript环境下Mongoose Slug插件不兼容问题

方案1:手动补全类型声明(适配无TS支持的插件)

针对mongoose-slug-generator这类未提供TypeScript类型定义的插件,可自行创建类型声明文件:

  • 在项目根目录新建types/mongoose-slug-generator/index.d.ts文件,写入基础类型声明:
declare module 'mongoose-slug-generator' {
  import { Schema } from 'mongoose';
  function slugGenerator(options?: Record<string, any>): (schema: Schema) => void;
  export = slugGenerator;
}
  • 修改tsconfig.json,将自定义类型目录加入typeRoots:
{
  "compilerOptions": {
    "typeRoots": ["./node_modules/@types", "./types"]
  }
}

方案2:自定义Slug生成逻辑(最可靠无依赖)

跳过第三方插件,直接用Mongoose预保存钩子实现Slug生成,完全兼容TS:

import mongoose, { Schema, Document } from 'mongoose';
import slugify from 'slugify';

interface IPost extends Document {
  title: string;
  slug: string;
}

const PostSchema: Schema<IPost> = new Schema({
  title: { type: String, required: true },
  slug: { type: String, unique: true }
});

// 预保存钩子自动生成slug
PostSchema.pre<IPost>('save', async function(next) {
  if (!this.isModified('title')) return next();
  
  // 生成基础slug,支持转小写、过滤特殊字符
  this.slug = slugify(this.title, { lower: true, strict: true });
  
  // 处理重复slug:添加时间戳后缀
  const existing = await mongoose.model<IPost>('Post').findOne({ slug: this.slug });
  if (existing) this.slug = `${this.slug}-${Date.now()}`;
  
  next();
});

const Post = mongoose.model<IPost>('Post', PostSchema);

方案3:选用原生支持TS的插件

优先选择自带TypeScript类型定义的Mongoose slug插件,安装时直接使用即可,例如安装带官方类型的插件时,无需额外配置类型:

npm install mongoose-slug-updater
npm install @types/mongoose-slug-updater --save-dev

内容的提问来源于stack exchange,提问作者Haythem Hedfi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:25:17