164

何が間違っているのかわからない、ここに私のcheck.jsがあります

var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));

var a1= db.once('open',function(){
var user = mongoose.model('users',{ 
       name:String,
       email:String,
       password:String,
       phone:Number,
      _enabled:Boolean
     });

user.find({},{},function (err, users) {
    mongoose.connection.close();
    console.log("Username supplied"+username);
    //doSomethingHere })
    });

ここに私のinsert.jsがあります

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/event-db')

var user = mongoose.model('users',{
     name:String,
     email:String,
     password: String,
     phone:Number,
     _enabled:Boolean
   });

var new_user = new user({
     name:req.body.name,
     email: req.body.email,
     password: req.body.password,
     phone: req.body.phone,
     _enabled:false
   });

new_user.save(function(err){
    if(err) console.log(err); 
   });

check.js を実行しようとすると、このエラーが発生します

一度コンパイルした「users」モデルは上書きできません

スキーマの不一致が原因でこのエラーが発生することは理解していますが、どこで発生しているのかわかりません。私はマングースとnodeJSにかなり慣れていません。

これは、MongoDB のクライアント インターフェイスから取得したものです。

MongoDB shell version: 2.4.6 connecting to: test 
> use event-db 
  switched to db event-db 
> db.users.find() 
  { "_id" : ObjectId("52457d8718f83293205aaa95"), 
    "name" : "MyName", 
    "email" : "myemail@me.com", 
    "password" : "myPassword", 
    "phone" : 900001123, 
    "_enable" : true 
  } 
>
4

38 に答える 38

242

このエラーが発生するもう 1 つの理由は、異なるファイルで同じモデルを使用しているが、requireパスの大文字と小文字が異なる場合です。

たとえば、私の状況ではrequire('./models/User')、あるファイルにあり、次に User モデルへのアクセスが必要な別のファイルにありましたrequire('./models/user')

モジュールとマングースのルックアップは、それを別のファイルとして扱っていると思います。ケースが両方で一致することを確認したら、それはもはや問題ではありませんでした。

于 2015-12-15T13:59:42.480 に答える
12

私がこのように書いているとき、これは私に起こりました:

import User from '../myuser/User.js';

ただし、実際のパスは「../myUser/User.js」です。

于 2017-07-01T06:55:01.437 に答える
5

これは一部の人にとってはヒットになるかもしれませんが、同様にエラーが発生し、インポート時にユーザー モデルのスペルを間違えたことに気付きました。

間違っている:const User = require('./UserModel'); 正しい:const User = require('./userModel');

信じられませんが、それを考慮してください。

于 2020-09-03T06:01:16.760 に答える
5

ここをクリック!_ 公式の例。最も重要です!このようにエクスポートすることです

export default mongoose.models.Item || mongoose.model('Item', itemsSchema)
于 2021-09-28T05:23:09.590 に答える
3

また、エクスポート時にできることもあります。既存のインスタンスが存在する場合は、必ずエクスポートしてください。

Typescript ソリューション:

import { Schema, Document, model, models } from 'mongoose';

const UserSchema: Schema = new Schema({
    name: {
        type: String
    }
});

export interface IUser extends Document {
    name: string
}

export default models.Users || model<IUser>('Users', UserSchema);
于 2020-09-03T15:34:11.780 に答える
2

これが発生するもう 1 つの理由を次に示します。おそらく、これは他の誰かを助けることができます。Member sと Member の違いに注意してください。それらは同じに違いない...

export default mongoose.models.Members || mongoose.model('Member', FamilySchema)

への変更:

export default mongoose.models.Member || mongoose.model('Member', FamilySchema)
于 2020-10-09T22:29:55.267 に答える
1
If you want to overwrite the existing class for different collection using typescript
then you have to inherit the existing class from different class.

export class User extends Typegoose{
  @prop
  username?:string
  password?:string
}


export class newUser extends User{
    constructor() {
        super();
    }
}

export const UserModel = new User ().getModelForClass(User , { schemaOptions: { collection: "collection1" } });

export const newUserModel = new newUser ().getModelForClass(newUser , { schemaOptions: { collection: "collection2" } });
于 2018-06-24T07:41:02.377 に答える