简体   繁体   中英

Nodejs, Mongoose and Jade get no data from Database

i was searching for my Problem but even don't know where is the problem.

I get the title which is set in my route but no data from the database...

My model:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    ObjectId = Schema.Types.ObjectId;


var blogSchema = new Schema({
  title: { type: String, required: true },
  author: { type: String, required: true },
  body: { type: String, required: true },
  date: { type: String, required: true },
  hidden: Boolean
});


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

my router:

var express = require('express'),
    Blog = require('../models/blog'),
    moment = require('moment');

moment.lang('de');

var router = express.Router();


router.get('/articles', function(req, res) {
    Blog.find(function(err, docs){
        return res.render('blog/articles', { 
            title: 'Blog_',
            articles: docs
        });
    });
}); 

app.use('/blog', router);

my jade

extends ../layouts/default
include ../elements/form-elements

block content

    h1= title
    each article in articles
        .col-md-12
            div.title= article.title

the only one i get displayed at the Page is

Blog_

So what iam doing wrong?

At the error file it only says:"Cannot read property 'title' of undefined"

So the articles objects are not set...but why?

Thanks so much

edit 1:

change article.title to article doesn't change anything

in the log files is

GET /blog/articles HTTP/1.1 304 - - 3 ms

edit 2:

it seems that node doesnt get any data from the db... and yes there is one testdata set ;)

console.log() ->

err: null

docs: []

Solution is posted as answer

got the solution...

the model wasn't right...

var blogSchema = new Schema({
  title: { type: String, required: true },
  author: { type: String, required: true },
  body: { type: String, required: true },
  date: { type: String, required: true },
  hidden: Boolean
}, {collection : 'blog'});

have to name the collection at the end...cause its written in small letters -.-

What a false - never ever do it again ^^

I know this is a very old question and it's marked by OP as answered, but I think the real problem was in "my router", you're not referencing your "docs" (the data coming back from the database) correctly. Keep in mind "docs" is an array so you would need to reference them like this:

router.get('/articles', function(req, res) {
    Blog.find(function(err, docs){
        return res.render('blog/articles', { 
            title: docs[0].title, // Get the title for first entry
            articles: docs[0].body // Get body for the first entry
        });
    });
});

I'm hardcoding the array index but you can use a loop to get every item from the array.

I don't think OPs solution fixes the problem because...

By default, when compiling models with:

const someModel = mongoose.model('someModel', SomeSchema);

mongoose creates a collection using 'someModel' name and adding an "s" at the end, so if you check your database, your collection should appear as 'someModels'. With OP's solution:

{ collection: 'blog' }

as the second parameter when creating the blog schema

var blogSchema = new Schema();

That default behavior is overwritten and the name of your collection will be whatever you set as the value for collection, in this case, "blog".

You can read more about it in Mongoose official docs or in the Models section in MDN - Node/Express/Mongoose

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM