0
votes

in my controller whenever i write this ,

const blogModel = mongoose.model('Blog'),  

it start to show error schema has not been registered

code of my model / Blog.js

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

let blogSchema = new mongoose.Schema({
    blogId: {
        type: String,
        unique: true
    }
 });

module.exports =  mongoose.model('Blog', blogSchema);

code of my controller/blogs.js here i have created a method getAllblogs to get all blogs

    const express = require('express')
    const mongoose = require('mongoose')
    const blogModel = mongoose.model('Blog')

    let getAllBlogs = (req,res) =>{
    blogModel.find()
    .select('-_v-_id')
    .lean()
    .exec((err,result) =>{
        if(err){
            console.log("error")
            res.send(err)
        }
        else if(result == undefined || result == null || result == '')
        {
            console.log("no blog found")
            res.send("no blog find")
        }
        else{
            console.log("blog found")
            res.send(result)
        }
    })
}

module.exports = {
    getAllBlogs:getAllBlogs
}

here is the error trace

C:\Users\dell\basicnode>node index.js

C:\Users\dell\basicnode\node_modules\mongoose\lib\index.js:456 throw new mongoose.Error.MissingSchemaError(name); ^ MissingSchemaError: Schema hasn't been registered for model "./../models/Blog.js ". Use mongoose.model(name, schema) at new MissingSchemaError (C:\Users\dell\basicnode\node_modules\mongoose\lib \error\missingSchema.js:22:11) at Mongoose.model (C:\Users\dell\basicnode\node_modules\mongoose\lib\index.j s:456:13) at Object. (C:\Users\dell\basicnode\controllers\blogs.js:3:29) at Module._compile (internal/modules/cjs/loader.js:701:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10) at Module.load (internal/modules/cjs/loader.js:600:32) at tryModuleLoad (internal/modules/cjs/loader.js:539:12) at Function.Module._load (internal/modules/cjs/loader.js:531:3) at Module.require (internal/modules/cjs/loader.js:637:17) at require (internal/modules/cjs/helpers.js:22:18) at Object. (C:\Users\dell\basicnode\routes\blog.js:3:22) at Module._compile (internal/modules/cjs/loader.js:701:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10) at Module.load (internal/modules/cjs/loader.js:600:32) at tryModuleLoad (internal/modules/cjs/loader.js:539:12) at Function.Module._load (internal/modules/cjs/loader.js:531:3)

code of my index.js

const mongoose = require('mongoose') 
const express = require('express') 
const appConfig = require('./config/appConFig') 
const fs = require('fs') 
const bodyParser = require('body-parser')
 const cookieParser = require('cookie-parser') 
const app = express() app.use(bodyParser.json()) 
app.use(bodyParser.urlencoded({extended:false})) app.use(cookieParser())

let routesPath = './routes'; 
fs.readdirSync(routesPath).forEach(function(file)  {
if(-file.indexOf('.js')){
    console.log("finmding the path");
    console.log(routesPath+'/'+file);
    let route = require(routesPath+'/'+file);
    route.setRouter(app);
} });

let modelsPath = './models'; 
fs.readdirSync(modelsPath).forEach(function(file)  {
if(-file.indexOf('.js')){

    let route = require(modelsPath+'/'+file);
} });

app.get('/', (req,res) => { 
res.send('hello world i am here');

let db = mongoose.connect(appConfig.db.uri,{useMongoClient:true});
}) 
mongoose.connection.on('error' , function(err) {
console.log("database connection error")
console.log(err) });

mongoose.connection.on('open' , function(err) {
if(err)
{
console.log("database connection error")
console.log(err)
}
else{
    console.log("connection success")
} }); app.listen(appConfig.port, () => console.log("listening onn "))
4
Can you share the code of the controller where you are exporting the model.? - Shubham Sharma
posted @ShubhamSharma - Vishal singh
Have you setup connection with mongodb using mongoose? Because I cannot see it any where in your code and you will also need to import your schema into your controller or can use model directly with mongoose. - Shubham Sharma
i have done that connection in my index.js file which i recently posted @ShubhamSharma and link of my git repo is github.com/vishalprasar/rest-api - Vishal singh

4 Answers

2
votes

Try Changing the line from

const blogModel = mongoose.model('Blog')

to

const blogModel = require('../model/Blog.js')

In your index.js file move the mongoose.connect on top of the file before the routes.

Update:

Change your index.js to

const mongoose = require("mongoose");
const express = require("express");
const appConfig = require("./config/appConFig");
const fs = require("fs");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
//const mod = require('./models/Blog')
const app = express();

mongoose.connect(appConfig.db.uri,{ useNewUrlParser: true });

mongoose.connection.on("error", function(err) {
  console.log("database connection error");
  console.log(err);
});

mongoose.connection.on("open", function(err) {
  if (err) {
    console.log("database connection error");
    console.log(err);
  } else {
    console.log("connection success");
  }
});

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

let routesPath = "./routes";
fs.readdirSync(routesPath).forEach(function(file) {
  if (-file.indexOf(".js")) {
    console.log("finmding the path");
    console.log(routesPath + "/" + file);
    let route = require(routesPath + "/" + file);
    route.setRouter(app);
  }
});

let modelsPath = "./models";
fs.readdirSync(modelsPath).forEach(function(file) {
  if (-file.indexOf(".js")) {
    let route = require(modelsPath + "/" + file);
  }
});

app.get("/", (req, res) => {
  res.send("hello world i am here");
});

app.listen(appConfig.port, () => console.log("listening onn "));

Then also change your blogs.js Controller to

const express = require('express')
const mongoose = require('mongoose')
 const blogModel = require('../models/Blog.js')

let getAllBlogs = (req,res) =>{
    blogModel.find()
    .select('-_v-_id')
    .lean()
    .exec((err,result) =>{
        if(err){
            console.log("error")
            res.send(err)
        }
        else if(result == undefined || result == null || result == '')
        {
            console.log("no blog found")
            res.send("no blog find")
        }
        else{
            console.log("blog found")
            res.send(result)
        }
    })
}


    module.exports = {
        getAllBlogs:getAllBlogs
    }
0
votes

I have gone through your code and found few issues as you have already registered Model then you will need to require it in your controllers/blog.js

const blogModel = require('../models/Blog')

And in your models/Blog.js

// importing mongoose module
const mongoose = require('mongoose')
const Schema = mongoose.Schema;

let blogSchema = new Schema(
    {
        blogId: {
            type: String,
            unique: true
        },
        title: {
            type: String,
            default: ''
        },
        description: {
            type: String,
            default: ''
        },
        bodyHtml: {
            type: String,
            default: ''
        },
        views: {
            type: Number,
            default: 0
        },
        isPublished: {
            type: Boolean,
            default: false
        },
        category: {
            type: String,
            default: ''
        },
        author: {
            type: String,
            default: ''
        },
        tags: [],

        created: {
            type: Date,
            default: Date.now
        }, 

        lastModified: {
            type: Date,
            default: Date.now
        }
    }
);

module.exports =  mongoose.model('Blog', blogSchema);

Secondly in your index.js move your connection to top instead of connecting it in routes callback.

const mongoose = require('mongoose')
const express = require('express')
const appConfig = require('./config/appConFig')
const fs = require('fs')
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')
//const mod = require('./models/Blog')
let db = mongoose.connect(appConfig.db.uri,{useMongoClient:true});
const app = express()
0
votes

You have created and exported mongoose schema properly....but you haven't imported it right! try this... const Blog=require("./models/blog.js"). you missed 'require' keyword...else everything is fine. have a nice day.

0
votes

model/Blog.js should be required first inside index.js. that way index.js will be aware that Blog is loaded into the mongoose. then you can require controller/blog.js where you defined

const blogModel = mongoose.model('Blog')

because this code is fetching "Blog" out of mongoose.