Mongoose स्कीमा को मॉडल के लिए पंजीकृत नहीं किया गया है


80

मैं औसत स्टैक सीख रहा हूं और जब मैं सर्वर का उपयोग शुरू करने का प्रयास करता हूं

npm start

मुझे यह कहते हुए एक अपवाद मिलता है कि:

schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema)

यहाँ मेरा कोड /models/Posts.js के अंदर है

var mongoose = require('mongoose');

var PostSchema = new mongoose.Schema({
    title: String,
    link: String, 
    upvotes: { type: Number, default: 0 },
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});

mongoose.model('Post', PostSchema);

जैसा कि मैं देख सकता हूं कि स्कीमा को मॉडल 'पोस्ट' के लिए पंजीकृत होना चाहिए, लेकिन संभावित रूप से अपवाद को फेंकने का क्या कारण हो सकता है?

अग्रिम में धन्यवाद।

संपादित करें: यहां अपवाद त्रुटि है

/home/arash/Documents/projects/personal/flapper-news/node_modules/mongoose/lib/index.js:323
  throw new mongoose.Error.MissingSchemaError(name);
        ^
MissingSchemaError: Schema hasn't been registered for model "Post".
Use mongoose.model(name, schema)

और यहाँ app.js mongoose आरंभीकरण के साथ कोड है:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

लाइन से पहले:

app.use('/', routes);

आप कहीं और गलती कर रहे हैं। उपरोक्त कोड मान्य है। शायद आपको Post.jsकहीं न कहीं "आवश्यकता" (आईएनजी) है, लेकिन आपने कभी मॉडल का "निर्यात" नहीं किया।
नील लून

@NeilLunn ठीक है मैं अपने अपवाद त्रुटि के साथ प्रश्न को संपादित करूंगा, क्योंकि यह सब मैं इससे पढ़ सकता हूं। शायद अन्य लोग देख सकते हैं कि मैं क्या नहीं देख सकता हूं
धनुषाकार

@ उम्म। क्या आपने कभी "निर्यात" किया था जहां आप बाद में "आवश्यक" थे? मुझे लगता है कि यह वह कोड है जो यहां गायब है।
नील लुन

@NeilLunn आप app.js में मतलब है? मुझे app.js कोड भी डालते हैं (केवल
मैंगोज

यदि आपका कोड आईडी है तो आप कभी भी मॉडल का "निर्यात" नहीं करते हैं। Geez अब तीन बार। आपको यह अब तक मिल जाना चाहिए।
नील लुन

जवाबों:


142

यह मॉडल निर्यात के साथ कोई समस्या नहीं है। मेरी भी यही समस्या थी।

असली मुद्दा यह है कि मॉडल के लिए बयानों की आवश्यकता होती है

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

मार्गों पर निर्भरता से नीचे थे। बस रूट निर्भरता के ऊपर mongoDB निर्भरता ले जाएँ। यह वही है जो यह दिखना चाहिए:

// MongoDB
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

@Mark var mongoose पर टिप्पणी करता है = आवश्यकता ("mongoose"); और टिप्पणियाँ और पोस्ट इसी तरह और फिर var पोस्ट जोड़ें = आवश्यकता ("पोस्ट"); सीधे रूटर.गेट और रूटर.पोस्ट के अंदर, और इसी तरह टिप्पणियाँ के लिए
धाय

यह स्कीमा त्रुटि को हल करने के लिए लग रहा था, लेकिन अब "राउटर को परिभाषित नहीं किया गया है" त्रुटि routes/index.js। मैं समझता हूं कि एक लापता संदर्भ त्रुटि क्या है, लेकिन मुझे लगा कि इस पर तुरंत विचार करने की आवश्यकता नहीं है .. किसी को भी यह मिलता है?
gin93r

@maiamachine क्या आपको कभी काम करने के लिए थिंकस्टर ट्यूटोरियल मिला? मैं लगभग एक सप्ताह से इस पर काम कर रहा था, और सभी जगह बेतरतीब मुद्दों के साथ अटका हुआ था। कोई भी मौका आप jsFiddle या कुछ पर काम कोड पोस्ट कर सकते हैं?
ट्रैविस हेटर

@ user8264: गतिशील रूप से बनाए गए स्कीमा मॉडल के लिए अपनी अवधारणा को कैसे लागू करें?
एस

48

यदि कोई सही उत्तर के दृष्टिकोण के साथ इसे ठीक नहीं करता है (मेरे जैसा), तो स्कीमा के निर्माण को देखने की कोशिश करें। मैंने 'रेफ' को 'उपयोगकर्ता' के रूप में लिखा था, लेकिन सही 'उपयोगकर्ता' था।

गलत:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'User'
}

सही बात:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'user'
}

2
मेरा मुद्दा तय किया :)
midhun k

32

यदि आप का उपयोग करें MongoDB कनेक्शन का उपयोग करें


सावधान रहें कि .populate () का उपयोग करते समय आप मॉडल प्रदान करें क्योंकि मानगो एक ही कनेक्शन पर "खोज" मॉडल होगा। यानी जहां:

var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639');
var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2');
var userSchema = mongoose.Schema({
  "name": String,
  "email": String
});

var customerSchema = mongoose.Schema({
  "name" : { type: String },
  "email" : [ String ],
  "created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' },
});

var User = db1.model('users', userSchema);
var Customer = db2.model('customers', customerSchema);

सही बात:

Customer.findOne({}).populate('created_by', 'name email', User)

या

Customer.findOne({}).populate({ path: 'created_by', model: User })

गलत ("मॉडल के लिए स्कीमा पंजीकृत नहीं किया गया है" त्रुटि):

Customer.findOne({}).populate('created_by');

2
इस समाधान ने मेरा मुद्दा तय कर दिया! findOne({}).populate({ path: 'created_by', model: User })
रिकार्डो सिल्वा

मेरे लिए किया। धन्यवाद कली
Aleks

@ user3616725: गतिशील रूप से बनाए गए स्कीमा मॉडल के लिए अपनी अवधारणा को कैसे लागू करें?
पप्पा एस

1
@PappaS जब तक आप मॉडल NAME को जानते हैं तब तक आप एक मॉडल उदाहरण के बजाय मॉडल का नाम दे सकते हैं: Customer.findOne({}).populate({ path: 'created_by', model: 'User' })लेकिन मॉडल पहले से ही एक ही उदाहरण पर पंजीकृत होना चाहिए।
user3616725

13

मैंने समस्या को हल करने के लिए निम्नलिखित दृष्टिकोण का उपयोग किया

const mongoose = require('mongoose');
const Comment = require('./comment');

const PostSchema = new mongoose.Schema({
            title: String,
            link: String, 
            upvotes: { type: Number, default: 0 },
            comments: [{ type: mongoose.Schema.Types.ObjectId, ref: Comment }]
        });
mongoose.model('Post', PostSchema);

कृपया देखें, यहाँ टाइप मान refनहीं है string, अब यह Commentस्कीमा की बात कर रहा है ।


1
Thx a lot, जो वास्तव में मेरे लिए एक ही रास्ता था - दर्जनों वेरिएंट आज़माने के बाद - आसानी से काम करने के लिए।
स्टेफन वाल्थर

गतिशील रूप से बनाए गए स्कीमा मॉडल के लिए अपनी अवधारणा को कैसे लागू करें?
पप्पा एस

4

यह त्रुटि तब भी सामने आती है जब हम मोंगोज़ मॉडल के बीच गलत संदर्भ (रेफ) बनाते हैं।

मेरे मामले में मैं मॉडल नाम के बजाय फ़ाइल नाम का उल्लेख कर रहा था।

उदाहरण के लिए:

const userModel = mongoose.model("user", userSchema);

हमें 'उपयोगकर्ता' (फ़ाइल नाम) के बजाय 'उपयोगकर्ता' (मॉडल नाम) का उल्लेख करना चाहिए;


मुझे एक ही समस्या थी जबकि एक मॉडल किसी अन्य मानदंड मॉडल को संदर्भित करता है। आपके उत्तर से प्रेरित होकर, सही MongoDB संग्रह नाम में परिवर्तन करें जो मेरे वर्तमान MongoDB संग्रह को संदर्भित करता है। समस्या सुलझ गयी। आपका बहुत बहुत धन्यवाद।
GoodApple

3

यहाँ पर https://mongoosejs.com/docs/populate.html#cross-db-populate है

यह कहता है कि हमें मॉडल को तीसरे तर्क के रूप में पारित करना होगा।

उदाहरण के लिए

//Require User Model
const UserModel = require('./../models/User');
//Require Post Model
const PostModel = require('./../models/Post');
const posts = await PostModel.find({})
            .select('-__v')
            .populate({
              path: 'user',
              select: 'name -_id',
              model: UserModel
            });
//or 
const posts = await PostModel.find({})
            .select('-__v')
            .populate('user','name', UserModel);


2
.\nodeapp\node_modules\mongoose\lib\index.js:452
      throw new mongoose.Error.MissingSchemaError(name);
      ^
MissingSchemaError: Schema hasn't been registered for model "users".
Use mongoose.model(name, schema)
    at new MissingSchemaError

सर्वर पर सेटटाइमआउट का उपयोग करते समय मुझे यह त्रुटि हल हो गई

mongoose.connect(env.get('mongodb.uri'), { useNewUrlParser: true })
  .then(() => logger.info("MongoDB successfully connected"))
  .catch(err => logger.error(err));
app.use(passport.initialize());
setTimeout(function() {
  require("./src/utils/passport")(passport);
}, 3000);

1

समस्या refs के साथ है, हमेशा यह सुनिश्चित करें कि मॉडल से आपके द्वारा निर्यात किए जा रहे किसी भी नाम पर रेफरी को संदर्भित करें।

// नमूना

const Task = mongoose.model('**Tasks**', taskSchema);

// रेफ

userSchema.virtual('tasks', {
ref: '**Tasks**',
localField: '_id', // field in current model
foreignField: 'owner' // corresponding field in other model

});


1

मैं भी उसी समस्या का सामना कर रहा था। मेरी समस्या का समाधान रेफरी पैरामीटर को देख रहा था जिसका मॉडल मैं वास्तव में निर्यात कर रहा था की तुलना में एक अलग नाम था और इसलिए ऐसा कोई मॉडल नहीं मिला।

userSchema.virtual('tasks', {
    ref: 'Task',
    localField: '_id',
    foreignField: 'owner'
})
  

जबकि जो मैंने वास्तव में निर्यात किया था वह था: -

const Tasks = mongoose.model('Tasks', taskSchema)

module.exports = Tasks

सुधार के बाद Taskके रूप में Tasksमेरी समस्या हल किया गया था


0

ऊपर राफेल ग्रिलि के उत्तर पर विस्तार से,

सही बात:

var HouseSchema = new mongoose.Schema({
  date: {type: Date, default:Date.now},
  floorplan: String,
  name:String,
  house_id:String,
  addressLine1:String,
  addressLine2:String,
  city:String,
  postCode:String,
  _locks:[{type: Schema.Types.ObjectId, ref: 'xxx'}] //ref here refers to the first parameter passed into mongoose.model()
});
var House = mongoose.model('xxx', HouseSchema, 'houseschemas');

0

आपको यह भी देखना चाहिए कि आपके डेटाबेस में गंदा डेटा नहीं है। मैं संदर्भित मॉडल के निचले संस्करण वाले एक दस्तावेज़ के साथ समाप्त हुआ ( userइसके बजाय User)। यह त्रुटि का कारण बनता है और नीचे ट्रैक करने के लिए अविश्वसनीय रूप से कठिन है।

त्वरित मैंगो क्वेरी के साथ तय करना आसान:

db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })

0

मेरे मामले में, यह समस्या इसलिए है क्योंकि मैंने मॉडल या रेफ मॉडल को आवेदन में शामिल नहीं किया है। तो आपको चाहिए Post modelऔर Comment modelआपके नोड एप्लीकेशन में।


0

नया मॉडल बनाते समय उसी नाम का संदर्भ लें जिसे आप मॉडल नाम में संदर्भित करते हैं।

उदाहरण के लिए: यदि मेरे पास मॉडल जैसा है:

var Post = mongoose.model("post",postSchema);

फिर मुझे लेखन के माध्यम से पोस्ट संग्रह का उल्लेख करना होगा ref:"post"


0

मैं भी इसी मुद्दे का सामना कर रहा हूं, लेकिन मैंने मॉड्यूल.एक्सपोर्ट को हटाकर हल किया है

mod.exports = mongoose.model ('उपयोगकर्ता', userSchema); // मॉड्यूल को हटा दें। पासपोर्ट
और उपयोग करें जैसे: mongoose.model ('उपयोगकर्ता', userSchema);

const mongoose = require('mongoose');
const ObjectId = require('mongoose').ObjectId;

var userSchema = new mongoose.Schema({
    Password: { type: String },  
    Email: { type: String, required: 'This field is required.', unique:true },  
    songs: [{ type: ObjectId, ref: 'Songs'}]
});

// Custom validation for email
userSchema.path('Email').validate((val) => {
    emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return emailRegex.test(val);
}, 'Invalid e-mail.');

// module.exports = mongoose.model('user', userSchema);  // remove 'module.exports ='
mongoose.model('user', userSchema); // resolved issue

0

मेरी समस्या को नीचे का उपयोग करके हल किया गया था

adminModel.findById (req.params.id) .populate ({पथ: "उपयोगकर्ता", मॉडल: userModel // उपयोगकर्ता संग्रह नाम})


0

बस यह जोड़ना चाहता था कि स्कीमा को आयात करते समय मैं विनाशकारी का उपयोग कर रहा था जो इसे विफल कर रहा था।

सही बात

var intakeSchema = require('../config/models/intake')

ग़लत

var { intakeSchema } = require('../config/models/intake')

0

आप मॉडल को कोई मूल्य नहीं दे रहे हैं

मेरे मामले में, मैं एक मॉडल का उपयोग कर रहा था जिसके लिए मैंने MongoDB कनेक्शन बनाते समय अपडेट नहीं किया था।

तो, मेरे पास कुछ ऐसा था

const Device = require('../../models/device')
// make use of Device

इस संबंध के साथ

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User])

ठीक कर

आपको connकनेक्शन शुरू करते समय मॉडल को जोड़ना होगा

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User, Device])

ध्यान दें कि मैंने Deviceकनेक्शन में जोड़ा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.