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

TypeError: Product不是构造函数——MongoDB API开发报错求助

TypeError: Product is not a constructor 解决方案

问题原因

你的代码报错是因为当前使用的Mongoose版本与2018年教程的版本不兼容。旧教程中通过new Product()实例化模型的写法,在新版本Mongoose中可能因模型导出时机、构造函数定义方式的变化导致识别异常;另外,旧教程的数据库连接是同步写法,新版本Mongoose采用异步连接,若服务器在连接完成前启动,也可能导致模型未正确加载。

修复方案

方案1:改用Mongoose官方推荐的create方法

直接替换实例化模型的代码,使用Product.create()创建并保存文档,这是兼容性更好的写法:

修改server.js中的POST接口:

app.post('/product', function(request, response) {
    Product.create({
        title: request.body.title,
        price: request.body.price
    }, function(err, savedProduct) {
        if (err) {
            response.status(500).send({error:"Could not save product"});
        } else {
            response.send(savedProduct);
        }
    });
});

方案2:降级Mongoose到5.x版本

如果想要完全遵循旧教程的代码逻辑,可以将Mongoose降级到2018年的主流版本(5.x):

  1. 卸载当前版本:
npm uninstall mongoose
  1. 安装指定版本:
npm install mongoose@5.13.20
  1. 保留原有代码即可正常运行。

额外优化:修复异步连接问题

新版本Mongoose的connect方法返回Promise,建议等待数据库连接成功后再启动服务器,避免模型加载异常:

更新server.js的连接与启动逻辑:

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var Product = require('./model/product');
var WishList = require('./model/wishlist');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

// 异步连接数据库,成功后启动服务
mongoose.connect('mongodb://localhost/swag-shop')
    .then(() => {
        console.log('MongoDB连接成功');
        app.listen(3000, () => {
            console.log("Swag Shop API running on port 3000...");
        });
    })
    .catch(err => console.error('数据库连接失败:', err));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:43:10