【问题标题】:How can I properly delete a user from a MongoDB array with React?如何使用 React 从 MongoDB 数组中正确删除用户?
【发布时间】: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/books{bookId}/${userid}) 和服务器端 router.delete('/:bookId/:userId',
  • 谢谢 - 我的设置不太适合,但我会继续尝试。你让我走到了一半。
  • 我知道,这就是我发布它的原因,以防其他人有同样的问题。 :)

标签: node.js reactjs mongodb express mongoose


【解决方案1】:

您是否尝试过使用 MongoDB 集合中的“Book.findOneAndDelete”一本书?您可以将您的 bookid 作为 id 传递给此例程。

【讨论】:

  • 谢谢 - 我调查了一下,但我觉得这需要 findOneAndUpdate 因为我不想删除这本书,只是删除数组中的用户。不过我实际上并没有在实践中尝试过。
  • 试过 findOneAndDelete 并没有什么不同。
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多