繁体   English   中英

在Node / Express CRUD API中返回的猫鼬查询

[英]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.

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