NodeJS中Mongoose Schema报错:TypeError: Cafe不是构造函数
解决
Cafe is not a constructor错误的方案 你在使用NodeJS、Express和MongoDB搭建咖啡馆网站时,尝试通过GET路由用自定义模型创建新数据,终端持续抛出UnhandledPromiseRejectionWarning: TypeError: Cafe is not a constructor错误,核心问题出在模型文件的导出语法错误。
错误原因
你的Schema定义文件(cafe.js)中,使用了错误的模块导出语法:module.export,而Node.js中正确的导出语法是module.exports(末尾多一个s)。这个拼写错误导致你在app.js中通过require("./models/cafe")引入的不是Mongoose模型构造函数,而是undefined,因此无法用new Cafe()实例化对象。
修复步骤
1. 修正模型文件的导出语句
修改cafe.js中的最后一行代码:
// 错误写法 module.export = mongoose.model('Cafe', CafeSchema); // 正确写法 module.exports = mongoose.model('Cafe', CafeSchema);
2. (推荐)添加路由错误捕获
由于你的路由使用了async/await,未处理的Promise拒绝会触发警告,建议用try/catch块捕获错误,增强代码健壮性:
app.get('/createcafe', async(req, res) => { try { const cafe = new Cafe ({ name: 'Cueva Matera', description: "A cave like theme cafe"}); await cafe.save(); res.send(cafe) } catch (err) { res.status(500).send(`创建咖啡馆数据失败:${err.message}`); console.error(err); } })
修正后的完整代码
cafe.js
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const CafeSchema = new Schema({ name: String, price: String, description: String, location: String }); module.exports = mongoose.model('Cafe', CafeSchema);
app.js(核心部分)
const path = require('path') const mongoose = require('mongoose'); const Cafe = require("./models/cafe"); mongoose.connect('mongodb://localhost:27017/cafe-hopping', { useNewUrlParser: true, useUnifiedTopology: true }) const db = mongoose.connection; db.on("error", console.error.bind(console, "connection error:")); db.once("open", () => { console.log("Database connected"); }); const app = express() app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'views')) app.get('/createcafe', async(req, res) => { try { const cafe = new Cafe ({ name: 'Cueva Matera', description: "A cave like theme cafe"}); await cafe.save(); res.send(cafe) } catch (err) { res.status(500).send(`创建咖啡馆数据失败:${err.message}`); console.error(err); } }) // 记得添加端口监听,比如: // app.listen(3000, () => { // console.log("Server running on port 3000"); // })
内容的提问来源于stack exchange,提问作者Liz7
相关产品推荐
相关产品推荐

