Вы также можете попытаться использовать print.function()
, который является S3 generic, чтобы получить функцию записи в консоли.
Ошибка возникает из-за того, что у вас уже определена схема, а затем вы снова определяете схему. Как правило, вам нужно создать экземпляр схемы один раз, а затем глобальный объект вызовет его, когда ему это нужно.
Например:
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);
check.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);
});
У меня была эта проблема во время модульного тестирования.
При первом вызове функции создания модели mongoose хранит модель под ключом, который вы предоставляете (например, «пользователи»). Если вы вызываете функцию создания модели с одним и тем же ключом более одного раза, mongoose не позволит вам перезаписать существующую модель.
Вы можете проверить, существует ли модель в мангусте с:
let users = mongoose.model('users')
Это вызовет ошибку, если модель не существует, поэтому вы можете ее обернуть в try / catch, чтобы либо получить модель, либо создать ее:
let users
try {
users = mongoose.model('users')
} catch (error) {
users = mongoose.model('users', <UsersSchema...>)
}
try exports.getModel = ()-> mongoose.model('User', userSchema) catch err exports.getModel = ()-> mongoose.model('User')
– Andi Giga
2 June 2017 в 08:34
заключается в том, что ваша схема уже проверена перед созданием новой схемы.
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);
Если вы работаете с expressjs, вам может потребоваться перенести определение модели за пределы app.get (), поэтому он вызывается только один раз при создании экземпляра сценария.
Это произошло со мной, когда я пишу так:
import User from '../myuser/User.js';
Однако истинный путь «../myUser/User.js'
Если вы сделали это здесь, возможно, у вас была та же проблема, что и я. Моя проблема заключалась в том, что я определял другую модель с тем же именем. Я назвал свою галерею и мою файловую модель «Файл». Дарн вы копируете и вставляете!
Итак, другой причиной, почему вы можете получить эту ошибку, является то, что вы используете одну и ту же модель в разных файлах, но ваш путь require
имеет другой случай. Например, в моей ситуации у меня было:
require('./models/User')
в одном файле, а затем в другом файле, где мне нужен доступ к модели User, у меня был require('./models/user')
.
Я предполагаю, что искать модули и amp; mongoose рассматривает его как другой файл. Как только я убедился, что дело соответствовало, это уже не проблема.
Если вы используете автономный сервер без сервера и не хотите использовать --skipCacheInvalidation
, вы можете очень хорошо использовать:
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
Определение схемы должно быть уникальным для коллекции, оно не должно быть более одной схемы для коллекции.
Я знаю, что есть принятое решение, но я чувствую, что текущее решение приводит к большому количеству шаблонов, чтобы вы могли тестировать Модели. Мое решение состоит в том, чтобы взять модель и поместить ее внутри функции, что приведет к возврату новой модели, если модель не была зарегистрирована, но возвращает существующую модель, если она есть.
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()
Открытие и закрытие соединения повсюду разочаровывают и плохо сжимаются.
Таким образом, если я должен был потребовать от модели два разных места или, более конкретно, в своих тестах, я бы не стал получать ошибки, и вся правильная информация вернулся.
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" } });
Эта проблема может возникнуть, если вы определяете две разные схемы с тем же именем коллекции
Я столкнулся с этой проблемой & amp; это произошло не из-за определений схемы, а из режима безсерверного автономного режима - мне просто удалось разрешить это с помощью этого:
serverless offline --skipCacheInvalidation
Что упоминается здесь https://github.com/dherault / serverless-offline / issues / 258
Надеюсь, это поможет кому-то другому, кто строит свой проект на сервере без сервера и работает в автономном режиме.
module.exports = mongoose.models.Users || mongoose.model('Users', UsersSchema);
– asked_io
11 May 2018 в 04:19
У меня была эта проблема во время «наблюдения». Когда тесты были отредактированы, часы повторно запускали тесты, но по этой причине они не сработали.
Я исправил это, проверив, существует ли модель, затем используйте ее, а затем создайте ее.
import mongoose from 'mongoose';
import user from './schemas/user';
export const User = mongoose.models.User || mongoose.model('User', user);
module.export = User
на export defaults User
. У меня также был refs
для пользователя из других моделей. Я не уверен, почему изменение с module.exports
до export default
привело к этой проблеме. Тем не менее, этот ответ, похоже, исправил это.
– runios
26 February 2018 в 09:11
mongoose.models
не существует, по крайней мере, в последних версиях
– Pedro Luz
25 April 2018 в 10:58
for (let model in mongoose.models) delete mongoose.models[model]
– E. Sundin
17 June 2018 в 21:02
ref
s для других моделей, это может привести к кошмару зависимости. Используйтеvar User = mongoose.model('user')
вместоrequire
. – wprl 27 September 2013 в 15:30