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 ,

5 回复

在使用 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);
};

解释

  1. 模型定义:将模型定义放在一个单独的文件中 (models/artPost.js)。
  2. 模型导出:通过 module.exports 导出定义好的模型。
  3. 模型导入:在需要使用模型的地方,通过 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.jsindex.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 中只引入一次模型文件,确保模型不会被多次定义。
  • 连接数据库:确保数据库连接仅执行一次,通常是在应用程序启动时进行连接。
  • 使用模型:通过引用全局变量中的模型实例来执行查询操作,而不是在每次调用时重新创建模型。

这样可以避免因为重复定义模型而导致的错误。

回到顶部