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
}
>
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);
});
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.
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...>)
}
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);
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!
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.
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.
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 "
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);
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.
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
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);
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" } });
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);
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.
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