Reputation: 41
It works fine for most cases of the this admin.js routing, however the .get() request near bottom for the .put() and delete() requests renders properly and the data is visible on the page, however in my terminal receive this error
... /admin.js:91 res.render('admin', {title: post.title, body: post.body}); ^
TypeError: Cannot read property 'title' of null
When attempting to edit or delete the post that is rendered on the form, I receive a 'This wepage is not visible' error. So it renders well and then crashes.
Here is the admin.js routing. Is it possibly an issue of ordering? I can't see why this would crash.
var express = require('express');
var router = express.Router();
var session = require('client-sessions');
var bcrypt = require('bcryptjs');
var mongoose = require('mongoose');
var User = mongoose.model('users');
var Post = mongoose.model('posts');
var Song = mongoose.model('songs');
var Project = mongoose.model('projects');
// check whether User is logged in
function requireLogin(req, res, next) {
if (!req.user) {
req.session.reset();
res.redirect('/admin');
} else {
next();
}
};
router
// Register
.get('/register', requireLogin, function(req, res) {
res.render('register');
})
.post('/register', function(req, res) {
new User({
name: req.body.name,
password: req.body.password
})
.save(function(err, user) {
res.redirect('/admin');
});
})
// Login
.get('/', function(req, res) {
res.render('login');
})
.post('/', function(req, res) {
User.findOne({name: req.body.name}, function(err, user) {
if (!user) {
res.render('login', {error: 'User not found'});
} else if (bcrypt.compareSync(req.body.password, user.password)) {
req.session.user = user;
res.redirect('/admin/dashboard');
} else {
res.render('login', {error: 'Incorrect Password'});
}
});
})
// Admin dashboard
.get('/dashboard', requireLogin, function(req, res) {
res.render('admin');
})
.post('/dashboard', function(req, res) {
// Depending on which form was filled, create new entry and redirect
if (req.body.postTitle) {
new Post({title: req.body.postTitle, body: req.body.body})
.save(function(err, post) {
res.redirect('/posts');
});
} else if (req.body.songTitle) {
new Song({title: req.body.songTitle, arist: req.body.artist, link: req.body.link})
.save(function(err, song) {
res.redirect('/music');
});
} else if (req.body.projectName) {
new Project({
name: req.body.projectName,
picture: req.body.picture,
languages: req.body.languages,
summary: req.body.summary
})
.save(function(err, project) {
res.redirect('/projects');
});
} else {
res.redirect('/');
}
})
.get('/dashboard/:title_slug', function(req, res) {
var query = {'title_slug': req.params.title_slug};
Post.findOne(query, function(err, post) {
res.render('admin', {title: post.title, body: post.body});
});
})
.put('/dashboard/:title_slug', function(req, res) {
var query = {'title_slug': req.params.title_slug};
var update = {'title': req.params.title, 'body': req.params.body};
var options = {new: true};
Post.findOneAndUpdate(query, update, options, function(err, post) {
res.render('admin',
{
title: post.title,
body: post.body
}
);
});
})
.delete('/dashboard/:title_slug', function(req, res) {
var query = {'title_slug': req.params.title_slug};
Post.findOneAndRemove(query, function(err, post) {
res.redirect('/');
});
})
// Logout
.get('/logout', function(req, res) {
req.session.reset();
res.redirect('/admin');
});
module.exports = router;
Example of form for DELETE request in admin.html
<div class='form posts-form'>
<h2>Posts</h2>
<form method='post' id='post' action'/admin/dashboard/{{post.title_slug}}?_method=DELETE'>
<label>Title</label>
<input type='text' name='postTitle' value='{{title}}'></br>
<label>Body</label>
<textarea name='body' form='post'>{{body}}</textarea></br>
<button type='submit'>Delete</button>
</form>
</div>
Upvotes: 0
Views: 138
Reputation: 541
Also check for if(!post){ console.log("no post found")}. Because it looks like there is no item found and you are trying to get title on a not founded object.
Post.findOne(query, function(err, post) {
if (err)
console.log(err);
if (!post)
console.log("not found")
else
res.render('admin', {title: post.title, body: post.body});
});
Upvotes: 2