Nodejs Mongoose 链接查询问题
Nodejs Mongoose 链接查询问题
在进行数据查询表 artPost
的时候,我发现只要我在页面上查询第二次程序就会报错:
Cannot overwrite `artPost` model once compiled. at NativeConnection.Connection.model
下面是我的查询代码:
artPost.prototype.artFind = function artFind(data,count,callback){
var PersonEntity = db.model('artPost');
PersonEntity.find(data).limit(count).exec(callback);
};
求教各位我上面的链接有什么问题吗,页面第一次进入的时候可以正常跑起来查询到数据,但是刷新页面或者重新载入,页面就会报错:
Cannot overwrite `artPost` model once compiled. at NativeConnection.Connection.model ,
在使用 Mongoose 进行数据库操作时,你遇到的错误 Cannot overwrite 'artPost' model once compiled
是因为你在每次调用 db.model('artPost')
时都试图重新定义一个已经存在的模型。Mongoose 不允许重复定义同一个模型名称。
解决方法
你可以通过确保模型只被定义一次来解决这个问题。通常的做法是在应用启动时定义所有需要的模型,并在其他文件中引用这些已定义的模型。以下是一个改进后的示例代码:
定义模型
首先,在你的应用程序启动时定义 artPost
模型:
// models/artPost.js
const mongoose = require('mongoose');
const artPostSchema = new mongoose.Schema({
// 在这里定义你的字段
title: String,
content: String,
createdAt: { type: Date, default: Date.now },
});
module.exports = mongoose.model('artPost', artPostSchema);
使用模型
然后在你需要使用该模型的地方,直接导入它:
// 在需要查询的地方
const artPostModel = require('./models/artPost');
artPost.prototype.artFind = function artFind(data, count, callback) {
artPostModel.find(data).limit(count).exec(callback);
};
示例代码
以下是完整的示例代码:
// models/artPost.js
const mongoose = require('mongoose');
const artPostSchema = new mongoose.Schema({
title: String,
content: String,
createdAt: { type: Date, default: Date.now },
});
module.exports = mongoose.model('artPost', artPostSchema);
// 在需要查询的地方
const artPostModel = require('./models/artPost');
artPost.prototype.artFind = function artFind(data, count, callback) {
artPostModel.find(data).limit(count).exec(callback);
};
解释
- 模型定义:将模型定义放在一个单独的文件中 (
models/artPost.js
)。 - 模型导出:通过
module.exports
导出定义好的模型。 - 模型导入:在需要使用模型的地方,通过
require
导入模型。
这样,Mongoose 只会在应用启动时定义一次 artPost
模型,不会重复定义导致错误。
提示你不能重写artPost模型,也就是说你的代码二次执行时,修改了那个模型,导致报错~
model
定义放到请求外面,不然每次执行会报错。
此问题已经解决,分享下解决方法,产生这个原因是我方法都是通过prototype扩展的,所以到导致了model重复加载,后面我改用了mongoose静态扩展的方法设置的就可以了: PersonSchema.statics.artFind = function(data,count,callback){
return this.find(data).limit(count).exec(callback);
}
希望可以帮到和我遇到同样问题的 同学
从错误信息来看,问题出在你试图多次定义或覆盖同一个模型(artPost
)。在Mongoose中,每个模型名称必须是唯一的。你可以在应用启动时定义一次模型,并在整个应用程序运行期间重用它。
示例代码
假设你有一个 artPost.js
模型文件,定义如下:
// models/artPost.js
const mongoose = require('mongoose');
const ArtPostSchema = new mongoose.Schema({
title: { type: String, required: true },
content: { type: String, required: true },
// 其他字段...
});
module.exports = mongoose.model('ArtPost', ArtPostSchema);
在你的主文件(例如 app.js
或 index.js
)中引入并使用该模型:
// app.js 或 index.js
const mongoose = require('mongoose');
const ArtPost = require('./models/artPost'); // 引入已定义好的模型
const artPostPrototype = {
artFind: function (data, count, callback) {
ArtPost.find(data).limit(count).exec(callback);
}
};
// 连接到数据库
mongoose.connect('mongodb://localhost:27017/yourdb', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => console.log('Connected to MongoDB'))
.catch(err => console.error('Could not connect to MongoDB.', err));
// 使用原型对象
const artPostInstance = Object.create(artPostPrototype);
artPostInstance.artFind({ title: 'test' }, 10, (err, docs) => {
if (err) return console.error(err);
console.log(docs);
});
解释
- 避免重复定义模型:通过在
app.js
中只引入一次模型文件,确保模型不会被多次定义。 - 连接数据库:确保数据库连接仅执行一次,通常是在应用程序启动时进行连接。
- 使用模型:通过引用全局变量中的模型实例来执行查询操作,而不是在每次调用时重新创建模型。
这样可以避免因为重复定义模型而导致的错误。