Mongoose模型陷入无限循环问题求助
使用Node.js的.load命令加载MongoDB Schema文件时触发无限循环的解决办法
问题现象
创建MongoDB基础Schema时遇到异常:
- 将Schema定义为变量后传入
mongoose.model(),用Node的.load命令加载文件会陷入无限循环,反复输出const mongoose = require('mongoose'); - 直接把Schema对象作为参数传入
mongoose.model()时,文件可正常加载。
触发无限循环的代码
const mongoose = require('mongoose'); mongoose.set('strictQuery', false) mongoose.connect('mongodb://127.0.0.1:27017/test'); let movie = new mongoose.Schema({ title: String, score: Number, year: Number }); const Movie = mongoose.model('Movie', movie);
正常运行的代码
const mongoose = require('mongoose'); mongoose.set('strictQuery', false) mongoose.connect('mongodb://127.0.0.1:27017/test'); const Movie = mongoose.model('Movie', { title: String, score: Number, year: Number });
原因分析
这是Node.js REPL的.load命令特性导致的:.load会把文件内容逐行输入到REPL环境执行,当你将Schema赋值给单独变量(比如movie),REPL执行完该行后会自动打印变量的值。而Mongoose的Schema对象内部存在递归引用或复杂属性,REPL在尝试打印该对象时会触发重复的模块加载逻辑,最终形成无限循环。
直接内联Schema到mongoose.model()时,没有单独的变量赋值操作,REPL不会主动打印未绑定变量的Schema对象,因此不会触发循环。
解决方案
- 内联Schema定义:采用已验证的写法,直接把Schema对象作为
mongoose.model()的参数传入,避免单独定义变量。 - 阻止REPL自动打印变量:如果需要单独定义Schema变量,可在变量定义行末尾加分号,或在文件末尾添加阻止输出的语句,示例如下:
const mongoose = require('mongoose'); mongoose.set('strictQuery', false) mongoose.connect('mongodb://127.0.0.1:27017/test'); let movie = new mongoose.Schema({ title: String, score: Number, year: Number }); const Movie = mongoose.model('Movie', movie); // 阻止REPL输出变量 void 0;
- 改用直接运行文件的方式:放弃使用
.load命令,直接通过node filename.js运行文件,这种方式不会触发REPL的自动打印行为,彻底避免循环问题。
内容的提问来源于stack exchange,提问作者aross2010
相关产品推荐
相关产品推荐

