节点/快速路由问题-调用不正确的路径

Node/Express Routing issue - invoking incorrect path

本文关键字:调用 不正确 路径 问题 路由 节点      更新时间:2023-09-26

一切似乎都工作得很好,但是当试图达到'/posts/new'时,我得到"TypeError:无法读取null的属性'title' "引用'/routes/posts.js:24'这是在'/:title' get方法。知道为什么吗?

"路线/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' with 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"的帖子,所以数据库搜索结果为空。这里应该有一个错误处理程序。错误似乎在title: post.title行。

如果首先定义了/new,如果匹配,将调用它。如果没有,则更通用的/:title将是。