Postman测试时出现TypeError: Product.create不是函数的问题求助
解决TypeError: Product.create/find is not a function错误
我已经完成所有连接配置,但在Postman测试接口时遇到两个错误:
- 调用创建接口时提示
TypeError: Product.create is not a function - 调用getAll接口时提示
TypeError: Product.find is not a function
以下是我的代码:
模型文件(models/product.model.js)
const mongoose = require("mongoose") const ProductSchema = new mongoose.Schema( { title: {type:String, required: [true,"{PATH} is required"] , minlength : [3, "{PATH} must be 3 or more"]}, price: {type:Number, required: [true,"{PATH} is required"], min : [0, "{PATH} must be 3 or more"]}, description: {type:String} },{timestamps:true} ) module.exports.Product = mongoose.model("Product",ProductSchema);
控制器文件(controllers/product.controller.js)
const Product = require("../models/product.model") module.exports = { getAll: (req,res) => { Product.find() .then(object=> res.json(object)) .catch(err=> res.json(err)) }, getOne: (req,res) => { Product.findOne({_id: req.params.id}) .then(object=> res.json(object)) .catch(err=> res.json(err)) }, create: (req,res) => { Product.create(req.body) .then(object=> res.json(object)) .catch(err=> res.status(400).json(err)) }, update: (req,res) => { Product.findByIdAndUpdate({_id: req.params.id}, req.body, {new:true, runValidators:true}) .then(object=> res.json(object)) .catch(err=> res.status(400).json(err)) }, delete: (req,res) => { Product.deleteOne({_id: req.params.id}) .then(confirm=> res.json(confirm)) .catch(err=> res.json(err)) } }
问题原因
问题出在模块导出与导入的不匹配:你的模型文件将mongoose模型挂载到了module.exports.Product属性上,但控制器里直接把整个导入的对象当成模型来调用方法——这个对象本身并没有find、create这些方法,真正的模型是它的Product属性。
解决方案(二选一即可)
方案1:修改控制器的导入方式
将控制器的导入语句改为解构导入,直接获取到模型:
const { Product } = require("../models/product.model")
方案2:修改模型的导出方式
如果不想改动控制器,也可以直接在模型文件里导出模型本身:
// 替换原来的module.exports.Product = ... module.exports = mongoose.model("Product",ProductSchema);
修改完成后,控制器里的Product就指向了正确的mongoose模型,调用find、create等方法就不会再报错。
内容的提问来源于stack exchange,提问作者Ramez mezni
相关产品推荐
相关产品推荐

