添加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
相关产品推荐
相关产品推荐

