array.push 方法不适用于我的 node.js 应用程序
array.push method not working for my node.js application
router.get("/timeline/:userId", async (req, res) => {
try {
//creating friend posts object
const friendPosts = await Promise.all(
currentUser.followings.map((friendId) => {
return Post.find({ userId: friendId });
})
);
var newFriendPosts = [];
friendPosts.map(async (friend) => {
friend.map(async (post) => {
const { profilePicture, username } = await User.findById(post.userId);
const newFriendPostsObject = {
...post.toObject(),
profilePicture,
username,
};
console.log(newFriendPostsObject);
newFriendPosts.push(newFriendPostsObject);
});
});
console.log(newFriendPosts);
// console.log(newUserPosts);
res.status(200).json(newUserPosts.concat(...newFriendPosts));
} catch (err) {
res.status(500).json(err);
}
});
所以对象值在 console.log(newFriendPostsObject) 中是正确的,但是当我将它推入数组时 newFriendPosts = [];它在 console.log(newFriendPosts);
中显示空数组
下面是我从数据库中获取用户详细信息的地方(数据库在 MongoDB 中):-
const { profilePicture, username } = await User.findById(post.userId);
.map()
async
不知道。因此,它只是继续 returns 一系列承诺。同时,您的代码从不等待这些承诺,因此您在任何 .push()
操作具有 运行 之前尝试使用 newFriendPosts
。 .push()
工作正常 - 您只是在实际调用 .push()
之前尝试使用数组。如果添加适当的 console.log()
语句,您将看到 newFriendPosts.push(...)
出现在 console.log(newFriendPosts);
.
之后
最简单的解决方法是将两个 .map()
语句更改为常规 for
循环,因为 for
循环是 async
感知的,并且会暂停循环 await
.
router.get("/timeline/:userId", async (req, res) => {
try {
//creating friend posts object
const friendPosts = await Promise.all(
currentUser.followings.map((friendId) => {
return Post.find({ userId: friendId });
})
);
const newFriendPosts = [];
for (let friend of friendPosts) {
for (let post of friend) {
const { profilePicture, username } = await User.findById(post.userId);
const newFriendPostsObject = {
...post.toObject(),
profilePicture,
username,
};
newFriendPosts.push(newFriendPostsObject);
}
}
console.log(newFriendPosts);
res.status(200).json(newUserPosts.concat(...newFriendPosts));
} catch (err) {
res.status(500).json(err);
}
});
此代码中的一个谜是 newUserPosts
似乎没有在任何地方定义。
router.get("/timeline/:userId", async (req, res) => {
try {
//creating friend posts object
const friendPosts = await Promise.all(
currentUser.followings.map((friendId) => {
return Post.find({ userId: friendId });
})
);
var newFriendPosts = [];
friendPosts.map(async (friend) => {
friend.map(async (post) => {
const { profilePicture, username } = await User.findById(post.userId);
const newFriendPostsObject = {
...post.toObject(),
profilePicture,
username,
};
console.log(newFriendPostsObject);
newFriendPosts.push(newFriendPostsObject);
});
});
console.log(newFriendPosts);
// console.log(newUserPosts);
res.status(200).json(newUserPosts.concat(...newFriendPosts));
} catch (err) {
res.status(500).json(err);
}
});
所以对象值在 console.log(newFriendPostsObject) 中是正确的,但是当我将它推入数组时 newFriendPosts = [];它在 console.log(newFriendPosts);
中显示空数组下面是我从数据库中获取用户详细信息的地方(数据库在 MongoDB 中):-
const { profilePicture, username } = await User.findById(post.userId);
.map()
async
不知道。因此,它只是继续 returns 一系列承诺。同时,您的代码从不等待这些承诺,因此您在任何 .push()
操作具有 运行 之前尝试使用 newFriendPosts
。 .push()
工作正常 - 您只是在实际调用 .push()
之前尝试使用数组。如果添加适当的 console.log()
语句,您将看到 newFriendPosts.push(...)
出现在 console.log(newFriendPosts);
.
最简单的解决方法是将两个 .map()
语句更改为常规 for
循环,因为 for
循环是 async
感知的,并且会暂停循环 await
.
router.get("/timeline/:userId", async (req, res) => {
try {
//creating friend posts object
const friendPosts = await Promise.all(
currentUser.followings.map((friendId) => {
return Post.find({ userId: friendId });
})
);
const newFriendPosts = [];
for (let friend of friendPosts) {
for (let post of friend) {
const { profilePicture, username } = await User.findById(post.userId);
const newFriendPostsObject = {
...post.toObject(),
profilePicture,
username,
};
newFriendPosts.push(newFriendPostsObject);
}
}
console.log(newFriendPosts);
res.status(200).json(newUserPosts.concat(...newFriendPosts));
} catch (err) {
res.status(500).json(err);
}
});
此代码中的一个谜是 newUserPosts
似乎没有在任何地方定义。