[英]Mongoose query returning in Node/Express CRUD API
在这种admin.js路由的大多数情况下,它都可以正常工作,但是.put()和delete()请求的底部附近的.get()请求可以正确呈现,并且数据在页面上可见,但是在我的终端上接收这个错误
... /admin.js:91 res.render('admin',{title:post.title,body:post.body}); ^
TypeError:无法读取null的属性“ title”
尝试编辑或删除在表单上呈现的帖子时,收到“此网页不可见”错误。 因此它呈现良好,然后崩溃。
这是admin.js路由。 可能是订购问题吗? 我不明白为什么这会崩溃。
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;
admin.html中的DELETE请求的表单示例
<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>
还要检查if(!post){console.log(“找不到帖子”)}。 因为看起来没有找到项目,所以您试图在未建立的对象上获得标题。
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});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.