MERN API 请求,不知道如何发出 put 请求并正确更新

Posted

技术标签:

【中文标题】MERN API 请求,不知道如何发出 put 请求并正确更新【英文标题】:MERN API request, don't know how to make a put request and update properly 【发布时间】:2022-01-09 11:43:45 【问题描述】:

首先让我说我是 MERN 堆栈的新手。我一直在通过教程学习,但是有些概念没有很好地解释。

使用 GET 时,我调用 /users。但是根据教程,当我发布时,我必须发布到 /user/new。不知道为什么它从复数(用户)变为单数(用户)。这是对 express 的警告,还是我正在创建一条新路线?

我最大的问题是我不知道如何提交 PUT 请求...我无法更新对象中的任何信息。我也在尝试将信息添加到我的 Animal 模型中的子数组中。

我将提供我的 App.js、server.js 和 Model(Animal),

SERVER.JS

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const twilio = require('twilio')

const app = express();

app.use(express.json());
app.use(cors());

mongoose.connect('mongodb://127.0.0.1:27017/newtable', 
    useNewUrlParser: true, 
    useUnifiedTopology: true 
).then(() => console.log("Connected to MongoDB")).catch(console.error);

app.listen(3008, () => console.log("Connected on Port 3008"));

const Animal = require('./models/Animals');

app.get('/animals', async(req, res) => 
    const animals = await Animal.find()
    res.json(animals)
)

app.post('/animals/new', (req, res) => 
    const animal = new Animal(
        phoneNumber: req.body.phoneNumber,
        textHistory: req.body.textHistory,
        name: req.body.name
    )
    animal.save()
    res.json(animal)
)

app.delete('/animal/delete/:id', async (req, res) => 
    const result = await Animal.findByIdAndDelete(req.params.id);
    res.json(result);
);

app.put('/animal/update/:id', async (req, res) => 
    const numba = await Animal.findOne(req.params.id);
    numba.phoneNumber = "gordage"
    numba.save();
    res.json(numba);
    console.log('asdfoij')
)

ANIMAL.JS(模型)

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const AnimalSchema = new Schema(
    phoneNumber: 
        type: String,
        required: false
    ,
    textHistory: 
        type: String,
        required: false
    ,
    name: 
        type: String,
        required: false
    
);

const Animal = mongoose.model("Animal", AnimalSchema);

module.exports = Animal;

App.js


import React, useState, useEffect from "react"
import './App.css';


function App() 
  const api_base = "http://localhost:3008"
  const [animals, setAnimals] = useState([])

  const GetAnimals = () => 
    fetch(api_base + "/animals")
    .then(res => res.json())
    .then(data => setAnimals(data))
    .catch((err) => console.error("error", err));
    console.log(animals)
  

  useEffect(() => 
    GetAnimals()
  , [])

  const deleteAnimal = async id => 
        const data = await fetch(api_base + '/animal/delete/' + id,  method: "DELETE" ).then(res => res.json());
        setAnimals(animals => animals.filter(animal => animal._id !== data.result._id));
    console.log('working')
    

  const addAnimal = async () => 
        const data = await fetch(api_base + "/animals/new", 
            method: "POST",
            headers: 
                "Content-Type": "application/json" 
            ,
            body: JSON.stringify(
                phoneNumber: "9175028901",
        textHistory: "benson",
        name: "beni"
            )
        ).then(res => res.json());

        setAnimals([...animals, data]);
    console.log("clicking")
    

  const changePhone = async id => 
    const data = await fetch(api_base + '/animal/phoneNumber/' + id).then(res => res.json());
    console.log("doing")
    
    setAnimals(animals => animals.map(animal => 
      if (animal._id === data._id) 
        animal.phoneNumber = "bensonhurst";
      
      return animal;
    ));
    console.log("doing")
  


  return (
    <div>
      <h1>Welcome to Beni's Table</h1>
      <table className="table">
        <thead>
          <tr>
            <th>One</th>
            <th>Two</th>
            <th>Three</th>
            <th>Four</th>
            <th>Five</th>
          </tr>
        </thead>
      </table>
      <h1>Animal List</h1>
      
        animals.map(animal => (
          <tbody>
            <td>animal.name</td>
            <td>animal._id</td>
            <td>animal.phoneNumber</td>
            <button onClick=() => changePhone(animal._id)>Change Phone</button>
            <button onClick=() => deleteAnimal(animal._id)>X</button>
          </tbody>
        ))
      
      <button onClick=addAnimal>add</button>
    </div>
  );


export default App;

【问题讨论】:

您可以使用postman 来协助您向您的服务器发送任何请求,还有其他软件您可以探索 我正在使用 REST 客户端,仍然没有运气.. 我无法通过 put 请求。我认为我的语法是错误的。 你的意思是你的 App.js 吗?我没有看到任何方法:“PUT” GET /users - API 获取所有用户 | POST /user/new - API 创建 1 个新用户 基本上为什么教程使用用户而不是用户 【参考方案1】:

如何从客户端提交 PUT 请求。我认为这是问题所在。您没有在 changePhone 方法的请求中指定方法 PUT 反应和快递端点是 /animal/update/:id 并且您正在调用 /animal/phoneNumber/。这就像与服务器通信,在请求选项中我们指定它们嘿“快速服务器”我想使用 PUT 方法所以请更新数据就像您在 POST 中指定的一样。还可以直观地了解 PUT 方法的作用会对您有所帮助。 (它会根据 id 通过覆盖它来更新现有数据,从而替换源的原始版本)

所以对两者的修复将是:

在 React 中获取 PUT 请求:

const requestOptions = 
    method: 'PUT',
    headers:  'Content-Type': 'application/json' ,
    body:  Animal: 'The data you want to change the exisiting data with' 
;
fetch(`/animal/update/$id`, requestOptions)
    .then(response => response.json())
    .then(data => console.log(data));

axios 中的 PUT 请求(基于 Promise 的 http 客户端):

const res = await axios.put(`/animal/update/$id`,  Animal: 'The data you want to change the exisiting data with' );

这是客户端的 Put 请求。现在让 Put 方法在服务器端更加清晰。请参考:https://thecodepixi.dev/blog/express-mongoose-crud-api/#updating-instances。

【讨论】:

谢谢。你有没有机会知道猫鼬的语法?另外,您将这个 Fetch PUT 请求放在哪里?我似乎仍然无法继续.. 我遇到了同样的问题......现在已经坚持了 2 天了。 Fetch put 请求应根据选择放置。例如:一个带有文本更新的按钮,我们制作处理程序,并将整个修改后的数据与正文中的放置请求一起发送。所以我们要做的是发送一个 id ,服务器将搜索该 id ,获取我们的请求正文并将其替换为新数据。这就是 PUT 方法的要点。在猫鼬只是谷歌它你会发现很多资源。还在回答中分享了一个链接。 用户想要编辑特定 id 的动物数据。在前端,他将单击按钮编辑。然后他会得到一个表格或任何东西来更新数据。我们会问他添加新数据。他会进去的。我们可以收集这些数据。跟踪它的状态。根据选择制作一个 onClick 处理程序或提交按钮。 (这一切都取决于您希望前端如何。我只是在给您 PUT 的直觉)。然后 fetch 或 axios put 请求将转到服务器。服务器将更新该 id 的查找数据并将其替换为新的。注意:PATCH 和 PUT 是不同的。 mongoosejs.com/docs/tutorials/findoneandupdate.html findOneandUpdate Mongoose 语法的官方文档。这将在将更新数据的服务器端端点上。

以上是关于MERN API 请求,不知道如何发出 put 请求并正确更新的主要内容,如果未能解决你的问题,请参考以下文章

PUT 请求 404 未找到错误邮递员? Node.js 快递

向 Spotify API 发出 PUT 请求时出现 401 错误

当您不知道页数时,如何使用 Node.js 在 while 循环中向 API 发出多个分页 GET 请求?

为啥 Fetch API 将第一个 PUT 请求作为 OPTIONS 发送

如何使用http在angular2中发出请求?

如何在 React Native 中向 API 发出 POST 请求?