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

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;

错误原因

  1. 模型创建方式错误:models/runners.js中使用new mongoose.Collection()来创建数据模型,这是完全错误的用法。mongoose.Collection是Mongoose底层操作MongoDB集合的对象构造器,不能直接绑定Schema创建可实例化的模型,它的参数结构不符合要求,导致内部初始化时options参数为undefined,进而触发读取Promise属性的报错。
  2. 冗余代码:模型文件中不需要引入express,属于无用代码。
  3. 变量未声明: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;

可选优化(提升项目健壮性)

  1. 给客户端返回响应:在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);
    }
})
  1. 确保MongoDB服务运行:启动项目前,确认本地MongoDB服务已经正常启动,否则会触发数据库连接失败的报错。

验证

修改完成后,重新运行node app.js,控制台会依次输出Connection is done和Listening to port 8000,说明项目启动成功。此时可以通过Postman或curl发送POST请求到http://localhost:8000/mens,测试数据插入功能是否正常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:24:38