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):
- 卸载当前版本:
npm uninstall mongoose
- 安装指定版本:
npm install mongoose@5.13.20
- 保留原有代码即可正常运行。
额外优化:修复异步连接问题
新版本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
相关产品推荐
相关产品推荐

