Node/Express 路由问题 - 调用不正确的路径

Node/Express Routing issue - invoking incorrect path

一切似乎都工作正常,但是当尝试到达“/posts/new”时,我得到 "TypeError: Cannot read property 'title' of null" 引用“/routes/posts.js:24”,它位于“/:标题' GET 方法。有什么想法吗?

'routes/posts.js'

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var Post = mongoose.model('posts');

/* posts displays*/
// posts index
router.get('/', (req, res) => {
    Post.find((err, posts) => {
        res.render(
            'posts/index', 
            {
                title: 'Get All the Posts!',
                posts: posts 
            }
        );
    });
});

// single post
router.get('/:title', (req, res) => {
    var query = {"title": req.params.title};
    Post.findOne(query, (err, post) => {
        res.render(
            'posts/post',
            {
                title: post.title,
                date: post.date,
                body: post.body
            }
        );
    });
});

/* posts new */
router
    // GET new posts route and form
    .get('/new', (req, res) => {
        res.render('posts/new', { title: 'Add a new Post' });
    })
    // POST new post data
    .post('/new', (req, res) => {
        new Post({
            title: req.body.title,
            date: req.body.date,
            body: req.body.body
        })
        // Save post to db 
        .save((err, post) => {
            res.redirect('/posts');
        });
    });

/* posts edit */
router
    // GET the post
    .get('/edit/:title', (req, res) => {
        var query = {'title': req.params.title};
        Post.findOne(query, (err, post) => {
            res.render(
                'posts/edit',
                {
                    title: post.title,
                    date: post.date,
                    body: post.body
                }
            );
        });
    })
    // PUT to update the post
    .put('/edit/:title', (req, res) => {
        var query = {'title': req.params.title};
        var update = {
            title: req.body.title,
            body: req.body.body
        };
        var options = {new: true};
        Post.findOneAndUpdate(query, update, options, (err, post) => {
            res.render(
                'posts/post',
                {
                    title: post.title,
                    date: post.date,
                    body: post.body
                }
            );
        });
    })
    // DELETE to delete a post
    .delete('/edit/:title', (req, res) => {
        var query = {'title': req.params.title};
        Post.findOneAndRemove(query, (err, posts) => {
            res.redirect('/');
        })
    });

module.exports = router;

'views/posts/new' Swig:

{% extends '../layout.html' %}

{% block title %}{% endblock %}

{% block content %}

    <h1>{{ title }}</h1>

    <form method='post' action='/posts/new' class='form-posts'>
        <label>Title:</label>
        <input type="text" name='title' class='form-posts-text' required>
        <label>Body</label>
        <input type="text" name='body' class='form-posts-body' required>
        <button type='submit' class='btn-submit'>Submit</button>
    </form>

{% endblock %}

尝试将 /new 的路由放在通用 /:title 根目录之前。

因为 /:title 是最先定义的,如果它匹配(确实如此),它就会首先被调用。由于您没有名称为 "new" 的 post,因此您的数据库搜索结果为空。你应该在那里有一个错误处理程序。错误似乎在 title: post.title.

如果先定义了/new,如果匹配就会被调用。如果不是,则更通用的 /:title 将是。