我有一个应用程序,允许用户添加笔记,我正在尝试添加一个删除功能的页面.我的路线:
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-s和https://stackoverflow.com/questions/63253129/successfully-delete-an-object-in-mongodb-using-findbyidanddelete-but-returns-an,但我仍然得到错误。提前感谢!
2条答案
按热度按时间x9ybnkn61#
两个问题。CastError:对于模型“Note”,路径“_id”处的值“undefined”(类型字符串),强制转换为ObjectId失败
首先,你得到的id是未定义的。这可能会导致问题,检查你的客户端是否通过日志或调试正确地发送了id。如果你传入了正确的字符串,Mongoose会自动为你转换它。
如果不起作用,请尝试使用mongoose.Types.ObjectId(req.params.id)
3yhwsihp2#
我终于弄明白了!我还把所有的东西都放在Note组件中以避免任何混乱,通过这样我发现了问题所在我的端点不正确:我不得不将其转换为一个箭头函数来正确调用handleClick并传递noteItem._id,而不是
<button onClick={handleClick}>
。现在这是“注记”元件: