javascript - Node/快速路由问题 - 调用不正确的路径

标签 javascript node.js express url-routing

一切似乎都工作正常,但是当尝试到达“/posts/new”时,我收到“TypeError:无法读取 null 的属性“标题””,引用“/routes/posts.js:24”,该属性位于'/:title' 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”的帖子,因此您的数据库搜索结果为空。您可能应该有一个错误处理程序。错误似乎出现在 title: post.title 行上。

如果/new先被定义,如果匹配就会被调用。如果没有,则使用更通用的 /:title

关于javascript - Node/快速路由问题 - 调用不正确的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33101761/

相关文章:

javascript - 添加列,然后按类别分隔数据

javascript - RadGrid 双击与单击

javascript - 无法从 Express.js 4.13.x 中的 req.body 读取 post 参数

node.js - Mongoose MongoDB : updating objects in a nested array

node.js - 当我不回答请求时,如何防止 express 发送 "502 Bad Gateway"?

javascript - 如何将样式(css)和js添加到 Handlebars 文件?

javascript - jQuery AJAX 自动刷新值

javascript - 想要隐藏密码输入

javascript - 无法使用nodejs的pdf2json处理多个pdf文件

node.js - NodeJS/express - 公共(public) API 端点的安全性