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

添加markup并清洗输入时遇TypeError: CPASchema.pre is not a function

解决TypeError: CPASchema.pre is not a function错误

问题描述

尝试为输入添加markup并进行清洗(sanitize)时,持续报错TypeError: CPASchema.pre is not a function,更换mongoose版本后问题仍未解决。

用户代码

const mongoose = require('mongoose');
const slug = require('slugify');
const createDomPurify = require('dompurify');
const marked = require('marked');
const {JSDOM} = require('jsdom');
const dompurify = createDomPurify( new JSDOM().window);

const CPASchema = {
   
   //SOME PART OF THIS CODE BUT UNNECESSARY TO THE QUESTION 

    answer:{
        type:String
    },

    sanitizedHTML:{
        type: String,
        required: true
    }
}

CPASchema.pre('validate', async function(data, next){ 

    if(data.answer) {
         console.log('JUST BEFORE SANITIZING')
        data.sanitizedHTML = await dompurify.sanitize(marked(data.answer));
    }
    next()

})

module.exports = mongoose.model('CPASchema', CPASchema);

报错信息

CPASchema.pre('validate', async function(data, next){
          ^

TypeError: CPASchema.pre is not a function

解决方案

核心问题是你定义的CPASchema只是普通JavaScript对象,并非Mongoose的Schema实例——只有Mongoose Schema实例才具备pre()这类中间件方法。

修改步骤:

  • 用mongoose.Schema()将对象转为Schema实例
  • 修正中间件参数:Mongoose中间件函数通过this访问当前文档,无需额外传入data参数
  • dompurify.sanitize是同步方法,不需要await

修改后的代码:

const mongoose = require('mongoose');
const slug = require('slugify');
const createDomPurify = require('dompurify');
const marked = require('marked');
const {JSDOM} = require('jsdom');
const dompurify = createDomPurify( new JSDOM().window);

// 用mongoose.Schema包装,创建合法的Schema实例
const CPASchema = new mongoose.Schema({
   
   //SOME PART OF THIS CODE BUT UNNECESSARY TO THE QUESTION 

    answer:{
        type:String
    },

    sanitizedHTML:{
        type: String,
        required: true
    }
});

// 修正中间件逻辑:通过this访问文档属性
CPASchema.pre('validate', function(next){ 
    if(this.answer) {
         console.log('JUST BEFORE SANITIZING')
        this.sanitizedHTML = dompurify.sanitize(marked(this.answer));
    }
    next();
});

// 模型名建议用单数形式,Mongoose会自动生成复数集合名
module.exports = mongoose.model('CPA', CPASchema);

内容的提问来源于stack exchange,提问作者Emmanuel Owino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:01:24