如何使用 React 从 MongoDB 数组中正确删除用户?
Posted
技术标签:
【中文标题】如何使用 React 从 MongoDB 数组中正确删除用户?【英文标题】:How can I properly delete a user from a MongoDB array with React? 【发布时间】:2021-04-01 18:38:38 【问题描述】:所以我觉得我已经接近了这个,只需要一个小修复来让它正确。我有一个包含 2 个用户和书籍集合的应用程序,我已经设置了它,如果 2 个用户拥有同一本书,他们将被添加到用户数组中,该数组也是书籍集合中的参考。
也就是说,我希望用户能够通过从该数组中删除用户来“删除一本书”,但我的路由无法完全正确。我尝试将 props.match.params.id 添加到前端路由,以及在过滤器之前使用 map,但效果不佳,所以现在我有一个 book ID。
有接受者吗?我发现了一些类似的问题,但我认为这有点复杂。我感谢任何 cmets 或想法!
这是 Node/Express 中的删除路由:
router.delete(
'/:id',
// passport.authenticate('jwt', session: false ),
async (req, res) =>
try
// if (!mongoose.Types.ObjectId.isValid( _id: req.params.id )) return false
const filter = _id: req.params.id
//$and: [
/* title: $eq: req.body.title ,
author: $eq: req.body.author */
//]
const update =
$pull: user: $in: [`$req.user.id`]
const book = await Book.findOneAndUpdate(filter,
update, new: true, runValidators: true , (err, book) =>
err ? res.json( success: false, err ) : res.status(200).json(book)
)
catch (err)
console.error(err.message)
res.status(500).send('Server Error')
)
这是 React 中的前端路由(2 sn-ps):
const removeUser = id =>
axios
.delete(`http://localhost:3001/api/books/5f7d619a58b64d50fdf494f5?&user=$id`, id)
.then(res =>
const books = state.books.filter(book => book._id !== id)
setState( books )
)
.catch(err => console.log(err))
const countBooks = filter =>
const books = state
return books.filter(book => filter ? book[filter] : book).length
return <>
<Count total=countBooks() />
<Form onNewBook=addBook />
<div className="row" style=divStyle>
<div className="col s5">Title</div>
<div className="col s4">Author</div>
<div className="col s3" style= marginBottom: '5px' >
<Link to="/compare">Read By?</Link>
</div>
</div>
state.books.map(book => <List book=book key=book._id onRemoveUser=removeUser />)
</>
这是来自 List 组件,其中包含一个模态:
<button
className="btn waves-effect waves-light"
onClick=() => onRemoveUser(book.user.map((user, i) => <p key=i style= margin: '0' >user._id</p>))
autoFocus
style= margin: '5px'
>
Yes
</button>
【问题讨论】:
尝试使用const filter = _id: mongoose.Types.ObjectId(req.params.id)
将字符串 id 转换为对象类型,如果它的对象 id 在集合 user: $in: [
$mongoose.Types.ObjectId(req.user.id)@987654327 中,也可以在更新部分内@
嘿,非常感谢 - 成功了!现在我唯一的问题是:将图书 ID 放在我的前端路由中的最佳方式是什么?
我不确定,但你可以做到 .delete(
localhost:3001/api/booksbookId/$userid)
和服务器端 router.delete('/:bookId/:userId',
谢谢 - 我的设置不太适合,但我会继续尝试。你让我走到了一半。
我知道,这就是我发布它的原因,以防其他人有同样的问题。 :)
【参考方案1】:
您是否尝试过使用 MongoDB 集合中的“Book.findOneAndDelete”一本书?您可以将您的 bookid 作为 id 传递给此例程。
【讨论】:
谢谢 - 我调查了一下,但我觉得这需要 findOneAndUpdate 因为我不想删除这本书,只是删除数组中的用户。不过我实际上并没有在实践中尝试过。 试过 findOneAndDelete 并没有什么不同。以上是关于如何使用 React 从 MongoDB 数组中正确删除用户?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 react-router-dom 中正确定义后备路由