【发布时间】:2022-01-11 08:58:03
【问题描述】:
在为社交媒体网络应用程序创建 node.js、express、mongoDb REST api 后,几乎所有基本的社交媒体操作(登录、注册、添加帖子、删除帖子、删除帐户、关注用户......) , 我目前面临一个问题,在实现为帖子添加书签功能后,在第一个用户删除他的帐户后,我无法想出解决方案来从另一个用户的书签帖子页面中删除书签帖子。我将在下面提供我的代码: (附注:书签是用户模型中的一个数组。我还想提一下我最初打算用于该任务的步骤:
-
通过ID获取当前用户
-
然后获取这个用户创建的所有帖子,它返回一个数组,所以我映射它来获取每个帖子的id
-
之后,我获取了应用程序中的所有用户,最初打算将每个用户内部的书签数组中的帖子与当前用户创建的帖子进行比较。然后我会从每个用户的书签数组中提取这些相同的帖子。 --> 我认为我分析的逻辑是可维护的,但它对我不起作用。这是下面的代码:
export const deleteUser = async (req, res) => { 试试 {
let user = await User.findById(req.params.userId) const userPosts = await Post.find({ creatorId: user._id }) const allUsers = await User.find() const myPostsIds = userPosts.map((post) => post._id.toString())
//这是我为我的任务实现的部分,但显然 有什么不对的地方
await Promise.all(
myPostsIds.forEach((id) =>
allUsers.map((user) => {
user.bookmarks.includes(id) &&
user.updateOne({ $pull: { bookmarks: id } })
})
)
)
await Post.deleteMany({ creatorId: user._id })
await user.remove()
res.status(200).json({
message: "Account has been deleted successfully!",
})
} catch (err) {
errorHandler(res, err)
}
}
【问题讨论】:
-
Promise.all需要一个 promise 数组,但forEach不会返回任何内容,请改用map并确保返回 Promise 或异步函数。 -
当用户删除一个特定帖子时,我使用了相同的策略,然后这个特定帖子会从其他用户的所有书签页面中删除。使用相同的 Promise.all 可以 100% 工作,因为 updateOne() 是一个 mongoDB 异步函数,它是一个承诺(期望等待)。这里的不同之处在于我没有以前的情况下的单个帖子 ID,这里是该用户创建的帖子数组。我已经尝试了所有可能的情况,但我认为我只是错过了一些东西。
-
Promise.all 如果您使用未定义的参数调用它,将抛出 TypeError (
TypeError: undefined is not iterable)。 (拨打Promise.all(undefined)试试看)。 -
是的,谢谢。我明白了你的意思,但是用 map 替换 forEach 对我来说并不奏效。我很确定这是导致该功能无法正常工作的一个小问题。在这一点上变得令人沮丧????
标签: javascript node.js mongodb web-development-server