Express+Mongoose项目中TypeError: Cannot read properties of undefined (reading 'Promise')错误排查与解决
Express+Mongoose项目启动报错排查与修复
问题重现
运行node app.js时出现以下报错:
PS C:\Users\Sohel\Desktop\mens100> node app.js C:\Users\Sohel\Desktop\mens100\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:26 this.Promise = options.Promise || Promise; ^ TypeError: Cannot read properties of undefined (reading 'Promise') at new NativeCollection (C:\Users\Sohel\Desktop\mens100\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:26:26) at Object. (C:\Users\Sohel\Desktop\mens100\models\runners.js:13:22) at Module._compile (node:internal/modules/cjs/loader:1105:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Module.require (node:internal/modules/cjs/loader:1005:19) at require (node:internal/modules/cjs/helpers:102:18) at Object. (C:\Users\Sohel\Desktop\mens100\app.js:3:22) at Module._compile (node:internal/modules/cjs/loader:1105:14)
涉及的核心代码文件:
app.js
const express = require("express"); require("./DB/conn"); const MensRankings = require("./models/runners"); const app = express(); app.use(express.json()); app.post('/mens' ,async(req,res)=>{ console.log(req.body); try { const addMensRecord = new MensRankings(req.body); const data = await addMensRecord.save() console.log(data); } catch (error) { console.log(error) } }) app.listen(8000, ()=>{ console.log("Listening to port 8000"); })
DB/conn.js
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/mens100') .then(()=>{ console.log("Connection is done"); }) .catch((e)=>{ console.log("error"); });
models/runners.js(问题所在)
const express = require('express'); const mongoose = require('mongoose'); runnersSchema = new mongoose.Schema({ ranking : Number, name : String, dob : Number, score :Number, country : String, } ); const MensRankings = new mongoose.Collection("Men", runnersSchema); module.exports = MensRankings;
错误原因
- 模型创建方式错误:
models/runners.js中使用new mongoose.Collection()来创建数据模型,这是完全错误的用法。mongoose.Collection是Mongoose底层操作MongoDB集合的对象构造器,不能直接绑定Schema创建可实例化的模型,它的参数结构不符合要求,导致内部初始化时options参数为undefined,进而触发读取Promise属性的报错。 - 冗余代码:模型文件中不需要引入
express,属于无用代码。 - 变量未声明:
runnersSchema未用const/let声明,会成为全局变量,存在污染风险。
解决方案
修正models/runners.js
将错误的模型创建方式改为Mongoose官方推荐的mongoose.model()方法,同时清理冗余代码:
const mongoose = require('mongoose'); // 用const声明Schema,避免全局变量污染 const runnersSchema = new mongoose.Schema({ ranking: Number, name: String, dob: Number, score: Number, country: String, }); // 正确创建模型:第一个参数为集合名称(Mongoose会自动转为复数形式),第二个为Schema const MensRankings = mongoose.model("Men", runnersSchema); module.exports = MensRankings;
可选优化(提升项目健壮性)
- 给客户端返回响应:在
app.js的POST接口中添加响应逻辑,避免客户端一直处于等待状态:
app.post('/mens', async(req,res)=>{ console.log(req.body); try { const addMensRecord = new MensRankings(req.body); const data = await addMensRecord.save() console.log(data); // 返回成功响应 res.status(201).send(data); } catch (error) { console.log(error); // 返回错误响应 res.status(400).send(error.message); } })
- 确保MongoDB服务运行:启动项目前,确认本地MongoDB服务已经正常启动,否则会触发数据库连接失败的报错。
验证
修改完成后,重新运行node app.js,控制台会依次输出Connection is done和Listening to port 8000,说明项目启动成功。此时可以通过Postman或curl发送POST请求到http://localhost:8000/mens,测试数据插入功能是否正常。
内容的提问来源于stack exchange,提问作者Sohel Bepari
相关产品推荐
相关产品推荐

