错误状态:使用 Node.js (express)、Angular 和 MongoDB 的 PUT 请求返回 404

Posted

技术标签:

【中文标题】错误状态:使用 Node.js (express)、Angular 和 MongoDB 的 PUT 请求返回 404【英文标题】:Error status: 404 returned with PUT request using Node.js (express), Angular, and MongoDB 【发布时间】:2020-10-21 09:21:35 【问题描述】:

我真的很想弄清楚如何将我的数据(“发布”)更新到 MongoDB(我使用的是 Mongoose、MongoDB、Node、Express 和 Angular 9.1.1)。我对 POST 和 DELETE 没有任何问题,但不知道 PUT 哪里出了问题。

在此先感谢,非常感谢所有帮助 -Geoff

角度:文件 post.ts

export class Post 
    id: string;
    title: string;
    message: string;
 

角度:文件postsService.ts

//Working OK
deletePost(postId: string) 
    this.http.delete(`http://localhost:3000/api/posts/$postId`)
        .subscribe(() => 
            const updatedPosts = this.posts.filter(post => post.id !== postId);
            this.posts = updatedPosts;
            this.postsUpdate$.next([...this.posts]);
        );
    

//Not working - I want to update one post
updatePost(postId: string, postTitle: string, postMessage: string) 
    const post: Post =  id: postId, title: postTitle, message: postMessage ;
    this.http.put(`http://localhost:3000/api/posts/$postId`, post)
        .subscribe(response => console.log(response));
    

节点服务器:文件 backend/app.js

// Working OK
app.delete("/api/posts/:id", (req, res, next) => 
    Post.deleteOne( _id: req.params.id ).then((result) => 
        console.log(req.params.id);
        res.status(200).json( msg: "Post deleted successfully!" );
    );
);

//Not working - I want to update one post
// Post is defined in file: backend/model/post.js
app.put("/api/post/:id", (req, res, next) => 
    const post1 = new Post(
        _id: req.body.id,
        title: req.body.title,
        message: req.body.message,
    );
Post.findOneAndUpdate( _id: req.params.id  ,post1)
    .then((result) => 
    console.log(result);
    res.status(200).json( msg: "Updated successfully!" );
    );
);

节点:后端/模型/post.js

const mongoose = require("mongoose");

//note "String is a class used in node/mongoDB"
const postSchema = mongoose.Schema(
    title:  type: String, required: true ,
    message:  type: String, required: true ,
);
// this will automaticly be stored in collection "posts"
module.exports = mongoose.model('Post', postSchema);

浏览器错误:

// HEADERS:
Request URL:http://localhost:3000/api/posts/5ef676c71105924a08b9e919
Request Method:PUT
Remote Address:127.0.0.1:3000
Status Code:
404
Version:HTTP/1.1
Referrer Policy:strict-origin-when-cross-origin

// REQUEST:
 
Request Payload:
"id":"5ef676c71105924a08b9e919", "title":"first Post ", "message":"This is just some text"

// RESPONCE:
Cannot PUT /api/posts/5ef676c71105924a08b9e919

但是在获取 URL 时一切正常:

"msg":"Post fetched successfully!","posts":"_id":"5ef676c71105924a08b9e919","title":"first Post ","message":"This is just some text","__v":0

【问题讨论】:

【参考方案1】:

您的 api put 请求指向错误的 url 角度

this.http.put(`http://localhost:3000/api/posts/$postId`, post)

后端

app.put("/api/post/:id", (req, res, next) => 

一个是发布另一个它的帖子。它们必须相同。

【讨论】:

非常感谢 - 就是这样 - 请注意,不要让程序感到疲倦 ;) 不客气。像这样的东西几乎总是一个你看不到的错字,因为你知道应该有什么,所以你看不到那里有什么。干杯队友【参考方案2】:

您似乎正在尝试更新一篇帖子的记录,因此您可以简单地尝试一下

router.put('/api/post/:id', async (req, res, next) => 
    return Post.updateOne(
            _id: req.params.id
        , 
            $set: 
                title: req.body.title,
                message: req.body.message
            
        )
        .then(result => res.json(result))
        .catch(err => console.log(err))
);

无需创建新帖子,因为您正在尝试根据 id 更新现有记录,并且您正在发送类似 api/post 的路由路径,但您收到来自服务器 api/posts 的响应所以也要检查你的路线。

【讨论】:

路径不匹配。感谢您显示带有错误处理的完整代码。我会试试的

以上是关于错误状态:使用 Node.js (express)、Angular 和 MongoDB 的 PUT 请求返回 404的主要内容,如果未能解决你的问题,请参考以下文章

将 Node.js 的 Express 与 vhost 一起使用时出现意外错误

Node.js/Express - 找不到页面时呈现错误

node.js,错误:找不到模块'express'

从 POST 访问中隐藏 Node.js&Express 中的错误消息

Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误

尝试将 Node.js (Express) 设置为与虚拟主机一起使用,并遇到意外错误