Nie można nadpisać modelu po skompilowaniu

Nie wiem, co robię źle, oto mój czek.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 })
    });
A oto moja wkładka.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); 
   });
/ Align = "left" / js, dostaję ten błąd

Nie można nadpisać modelu' users ' po skompilowaniu .

Rozumiem, że ten błąd wynika z niedopasowania schematu, ale nie widzę, gdzie to się dzieje ? Jestem całkiem nowy w mongoose i nodeJS.

Oto, co otrzymuję z interfejsu klienta mojego 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" : "[email protected]", 
    "password" : "myPassword", 
    "phone" : 900001123, 
    "_enable" : true 
  } 
>
Author: devprashant, 2013-09-27

15 answers

Błąd występuje, ponieważ masz już zdefiniowany schemat, a następnie definiujesz schemat ponownie. Ogólnie rzecz biorąc, co należy zrobić, to utworzyć instancję schematu raz, a następnie mieć globalny obiekt wywołać go, gdy tego potrzebuje.

Na przykład:

User_model.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
   name:String,
   email:String,
   password:String,
   phone:Number,
   _enabled:Boolean
});
module.exports = mongoose.model('users', userSchema);          
Szach.js
var mongoose = require('mongoose');
var User = require('./user_model.js');

var db = mongoose.createConnection('localhost', 'event-db');
db.on('error', console.error.bind(console, 'connection error:'));
var a1= db.once('open',function(){
  User.find({},{},function (err, users) {
    mongoose.connection.close();
    console.log("Username supplied"+username);
    //doSomethingHere 
  })
});

Insert.js

var mongoose = require('mongoose');
var User = require('./user_model.js');

mongoose.connect('mongodb://localhost/event-db');
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); 
});
 71
Author: thtsigma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 13:24:04

Więc Innym powodem, dla którego może wystąpić ten błąd jest użycie tego samego modelu w różnych plikach, ale ścieżka require ma inną wielkość liter. Na przykład w mojej sytuacji miałem:

require('./models/User') w jednym pliku, a następnie w innym pliku, w którym potrzebowałem dostępu do modelu użytkownika, który miałem require('./models/user').

Myślę, że szukanie modułów i mangusty traktuje to jako inny plik. Kiedy upewniłem się, że sprawa pasuje do obu, nie było już problemu.

 114
Author: jonnie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 13:59:42

Miałem taki problem podczas testów jednostkowych.

Przy pierwszym wywołaniu funkcji tworzenia modelu mongoose przechowuje model pod podanym kluczem (np. 'users'). Jeśli wywołasz funkcję tworzenia modelu z tym samym kluczem więcej niż raz, mongoose nie pozwoli Ci zastąpić istniejącego modelu.

Możesz sprawdzić, czy model już istnieje w mongoose za pomocą:

let users = mongoose.model('users')

Spowoduje to wyświetlenie błędu, jeśli model nie istnieje, więc możesz go zawinąć w try/catch, aby: Pobierz model lub utwórz go:

let users
try {
  users = mongoose.model('users')
} catch (error) {
  users = mongoose.model('users', <UsersSchema...>)
}
 26
Author: BJ Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-01 10:26:26

Miałem ten problem podczas 'oglądania' testów. Kiedy testy zostały edytowane, zegarek ponownie uruchomił testy, ale nie z tego powodu.

Naprawiłem to sprawdzając, czy model istnieje, następnie użyj go, w przeciwnym razie utwórz go.

import mongoose from 'mongoose';
import user from './schemas/user';

export const User = mongoose.models.User || mongoose.model('User', user);
 19
Author: ZephDavies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 13:18:31

Jeśli tu dotarłeś, to możliwe, że miałeś ten sam problem, co ja. Mój problem polegał na tym, że definiowałem inny model o tej samej nazwie . Nazwałem moją galerię i mój Model pliku "Plik". Cholera, Kopiuj i wklej!

 11
Author: James Harrington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-06 03:23:41

Doświadczałem tego problemu i nie było to spowodowane definicjami schematu, ale raczej bezserwerowym trybem offline - po prostu udało mi się go rozwiązać za pomocą tego:

serverless offline --skipCacheInvalidation

Który jest tutaj wymieniony https://github.com/dherault/serverless-offline/issues/258

Miejmy nadzieję, że pomoże to komuś, kto buduje swój projekt w trybie bezserwerowym i działa w trybie offline.

 11
Author: user5301210,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 16:36:15

Wiem, że istnieje zaakceptowane rozwiązanie, ale uważam, że obecne rozwiązanie skutkuje dużą ilością kotła tylko po to, aby można było testować modele. Moim rozwiązaniem jest zasadniczo zabrać ci model i umieścić go wewnątrz funkcji, co skutkuje zwróceniem nowego modelu, jeśli Model nie został zarejestrowany, ale zwróceniem istniejącego modelu, jeśli tak.

function getDemo () {
  // Create your Schema
  const DemoSchema = new mongoose.Schema({
    name: String,
    email: String
  }, {
    collection: 'demo'
  })
  // Check to see if the model has been registered with mongoose
  // if it exists return that model
  if (mongoose.models && mongoose.models.Demo) return mongoose.models.Demo
  // if no current model exists register and return new model
  return mongoose.model('Demo', DemoSchema)
}

export const Demo = getDemo()

Otwieranie i zamykanie połączeń w każdym miejscu jest frustrujące i nie kompresuje się dobrze.

W ten sposób gdybym wymagał model dwa różne miejsca lub dokładniej w moich testach nie dostałbym błędów i wszystkie poprawne informacje są zwracane.

 3
Author: Moosecouture,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-10 13:15:58

Przytrafiło mi się to kiedy piszę tak:

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

Jednak prawdziwą ścieżką jest'../ myUser / User.js "

 3
Author: ip192,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-01 06:55:01

Jeśli używasz Serverless offline i nie chcesz używać --skipCacheInvalidation, możesz bardzo dobrze używać:

module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
 2
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-15 18:35:22

Definicja schematu powinna być unikalna dla zbioru, nie powinna być większa niż jeden schemat dla zbioru.

 0
Author: KARTHIKEYAN.A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 05:06:53

Ten problem może wystąpić, jeśli zdefiniujesz 2 różne schematy o tej samej nazwie kolekcji

 0
Author: Rohit Reddy Abbadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-30 07:00:15

Jest ponieważ twój schemat jest już, zweryfikuj przed utworzeniem nowego schematu.

var mongoose = require('mongoose');
module.exports = function () {
var db = require("../libs/db-connection")();
//schema de mongoose
var Schema = require("mongoose").Schema;

var Task = Schema({
    field1: String,
    field2: String,
    field3: Number,
    field4: Boolean,
    field5: Date
})

if(mongoose.models && mongoose.models.tasks) return mongoose.models.tasks;

return mongoose.model('tasks', Task);
 0
Author: Diego Santa Cruz Mendezú,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-06 07:07:39
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" } });
 0
Author: Rohit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-24 07:41:02

Możesz to łatwo rozwiązać, wykonując

delete mongoose.connection.models['users'];
const usersSchema = mongoose.Schema({...});
export default mongoose.model('users', usersSchema);
 0
Author: pihyper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 17:08:57

Jeśli pracujesz z expressjs, może być konieczne przeniesienie definicji modelu poza aplikację.get() jest więc wywoływana tylko raz, gdy skrypt jest tworzony.

 -4
Author: Elesin Olalekan Fuad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 19:16:42