axios 删除条目时,将objectId作为属性传递到何处?

atmip9wb  于 2022-11-05  发布在  iOS
关注(0)|答案(2)|浏览(124)

我有一个应用程序,允许用户添加笔记,我正在尝试添加一个删除功能的页面.我的路线:

router.route('/:id').delete((req, res) => {
Note.findByIdAndDelete(req.params.id)
    .then(() => res.json('Exercise deleted!'))
    .catch(err => res.status(err).json('Error ' + err))
})

当我在Postman中测试它时,它可以工作,但是我还没有设法从数据库中获得ObjectId。它抛出一个错误:无效的状态代码:CastError: Cast to ObjectId failed for value "undefined" (type string) at path "_id" for model "Note" .
这是我的Note架构:

const noteSchema = new Schema({
category: {type: String, required: false},
title: {type : String, required: true},
content: {type: String, required: true},
noteID: { type: mongoose.SchemaTypes.ObjectId, required: true, index: true }
}, {
timestamps: true,
})

这是我的Note组件:

import React from "react";
function Note(props) {
function handleClick() {
    props.onDelete(props.id);
  }
return (
<div className="note">
      <h1>{props.title}</h1>
      <p>{props.content}</p>
      <button onClick={handleClick}>
        Delete
</button>
      <p>{props.category}</p>
</div>
  );
  }
export default Note

我应用程序组件:

function App() {
const [notes, setNotes] = useState([]);
useEffect(() => {
fetch('http://localhost:5000/notes')
    .then(res => res.json())
    .then(json => setNotes(json))
  }, [])
function deleteNote(id) {
    axios.delete('http://localhost:5000/notes/'+id)
      .then(response => { console.log(response.data)});
  }

{notes.map((noteItem, index) => {
return (
          <Note
key={index}
//id={index}
title={noteItem.title}
content={noteItem.content}
category={noteItem.category}
onDelete={deleteNote}
/>
        );

我不确定从数据库中将id传递到哪里,我尝试将其作为App.js (deleteNote(note.id))或其变体中的参数传递,但它不起作用。有人能告诉我在获取ObjectId时遗漏了哪一步吗?我还尝试在将笔记Map到Note组件时传递noteItem._id,但这会立即删除所有笔记。我还尝试了以下解决方案:https://stackoverflow.com/questions/71544895/how-do-i-solve-casterror-cast-to-objectid-failed-for-value-undefined-type-shttps://stackoverflow.com/questions/63253129/successfully-delete-an-object-in-mongodb-using-findbyidanddelete-but-returns-an,但我仍然得到错误。提前感谢!

x9ybnkn6

x9ybnkn61#

两个问题。CastError:对于模型“Note”,路径“_id”处的值“undefined”(类型字符串),强制转换为ObjectId失败
首先,你得到的id是未定义的。这可能会导致问题,检查你的客户端是否通过日志或调试正确地发送了id。如果你传入了正确的字符串,Mongoose会自动为你转换它。
如果不起作用,请尝试使用mongoose.Types.ObjectId(req.params.id)

3yhwsihp

3yhwsihp2#

我终于弄明白了!我还把所有的东西都放在Note组件中以避免任何混乱,通过这样我发现了问题所在我的端点不正确:我不得不将其转换为一个箭头函数来正确调用handleClick并传递noteItem._id,而不是<button onClick={handleClick}>
现在这是“注记”元件:

import React, {useState,useEffect} from "react";
import axios from "axios";

function Note(props) {
  const [notes, setNotes] = useState([])

  useEffect(() => {
    fetch('http://localhost:5000/notes')
    .then(res => res.json())
  .then(json => {console.log(json)
    setNotes(json)})
  }, [])

  function deleteNote(id) {
    axios.delete(`http://localhost:5000/notes/${id}`)
    .then(() => { console.log("Note successfully deleted")});
  }

return (
  <div>
  {notes.map((noteItem, index) => {
    return (
        <div className="note">
       <h1>{noteItem.title}</h1>
       <p>{noteItem.content}</p>
       <button onClick={() => {deleteNote(noteItem._id)}}>
         Delete
       </button>
       <p>{noteItem.category}</p>
     </div>

    );
  })}
  </div>
)
  }

  export default Note

相关问题