【发布时间】: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