模式尚未注册模型错误显示
Posted
技术标签:
【中文标题】模式尚未注册模型错误显示【英文标题】:schema has not been registered for model error showing 【发布时间】:2019-11-16 21:48:39 【问题描述】:每当我写这个时,在我的控制器中,
const blogModel = mongoose.model('Blog'),
它开始显示错误架构尚未注册
我的模型代码/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);
我的控制器/blogs.js 的代码 这里我创建了一个 getAllblogs 方法来获取所有博客
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
这是错误跟踪
C:\Users\dell\basicnode>节点索引.js
C:\Users\dell\basicnode\node_modules\mongoose\lib\index.js:456 抛出新的 mongoose.Error.MissingSchemaError(name); ^ MissingSchemaError: 模式尚未注册模型“./../models/Blog.js”。使用 mongoose.model(name, schema) 在新的 MissingSchemaError (C:\Users\dell\basicnode\node_modules\mongoose\lib \error\missingSchema.js:22:11) 在 Mongoose.model (C:\Users\dell\basicnode\node_modules\mongoose\lib\index.js:456:13) 在对象。 (C:\Users\dell\basicnode\controllers\blogs.js:3:29) 在 Module._compile (internal/modules/cjs/loader.js:701:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10) 在 Module.load (internal/modules/cjs/loader.js:600:32) 在 tryModuleLoad (internal/modules/cjs/loader.js:539:12) 在 Function.Module._load (internal/modules/cjs/loader.js:531:3) 在 Module.require (internal/modules/cjs/loader.js:637:17) 在需要(内部/模块/cjs/helpers.js:22:18) 在对象。 (C:\Users\dell\basicnode\routes\blog.js:3:22) 在 Module._compile (internal/modules/cjs/loader.js:701:30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10) 在 Module.load (internal/modules/cjs/loader.js:600:32) 在 tryModuleLoad (internal/modules/cjs/loader.js:539:12) 在 Function.Module._load (internal/modules/cjs/loader.js:531:3)
我的 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 "))
【问题讨论】:
你能分享你导出模型的控制器的代码吗? 张贴@ShubhamSharma 您是否使用 mongoose 设置了与 mongodb 的连接?因为我在您的代码中的任何地方都看不到它,您还需要将您的架构导入到您的控制器中,或者可以直接将模型与猫鼬一起使用。 我已经在我最近发布的@ShubhamSharma 的 index.js 文件中完成了这个连接,我的 git repo 的链接是github.com/vishalprasar/rest-api 【参考方案1】:model/Blog.js 应该首先需要在 index.js 中。这样 index.js 就会知道 Blog 已加载到猫鼬中。那么你可以在你定义的地方 require controller/blog.js
const blogModel = mongoose.model('Blog')
因为这段代码正在从猫鼬中获取“博客”。
【讨论】:
【参考方案2】:您已经正确创建和导出了 mongoose 架构....但是您没有正确导入它! 试试这个... const Blog=require("./models/blog.js")。 你错过了'require'关键字......否则一切都很好。 祝你有美好的一天。
【讨论】:
【参考方案3】:我查看了您的代码并发现了一些问题,因为您已经注册了模型,那么您需要在 controllers/blog.js
中要求它
const blogModel = require('../models/Blog')
在你的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);
其次,在您的 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 mod = require('./models/Blog')
let db = mongoose.connect(appConfig.db.uri,useMongoClient:true);
const app = express()
【讨论】:
【参考方案4】:尝试从
更改行const blogModel = mongoose.model('Blog')
到
const blogModel = require('../model/Blog.js')
在您的 index.js 文件中,将文件顶部的 mongoose.connect 移动到路由之前。
更新:
将你的 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 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 "));
然后还将您的 blogs.js 控制器更改为
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
【讨论】:
好的发布@TRomesh 这应该可以,你在这里遇到什么错误? @Vishalsingh 你能发布你的 index.js 文件吗? 是的,发布了@TRomesh,我的 git repo 的链接是github.com/vishalprasar/rest-api @Vishalsingh 很高兴听到这个消息。你可以接受这个作为答案。以上是关于模式尚未注册模型错误显示的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:尚未为模型“a”注册架构。使用 mongoose.model(name, schema)
尚未为模型“ResourceSchema”注册架构。 - 嵌套js