Express 不会使用 .map() 获得其他用户



我遇到了一个问题,我可以创建与多人的对话2等等。但是,我不明白为什么它不将数据存储到单独的用户模型中。

这是一段你只需要知道的代码:

router.post(
"/",
auth,
[
check("conversators", "There should be at least two conversators").isLength(
{ min: 2 }
),
],
async (req, res) => {
const { conversators } = req.body;
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
try {
let conversation = new Conversation({
user: req.user.id,
conversators: conversators,
});
await conversators.map(async (conversator) => {
let user = await User.findById(conversator);
let newData = user;
newData.conversations.push(conversation.id);
console.log('Created data', newData);
let newUser = await User.findOneAndUpdate(
{ user: conversator },
{
$set: {
newData,
},
},
{ new: true }
);
await newUser.save();
console.log(newUser);
});
await conversation.save();
res.status(200).json(conversation);
} catch (error) {
console.error(error.message);
res.status(500).send("Server error.");
}
}
);
module.exports = router;

我可以保证的是这一行:console.log('Created data', newData);打印所需的数据。但是,下一个控制台:console.log(newUser);打印的User模型与前一个相同。

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const UserSchema = new Schema({
name: {
type: String,
required: true,
},
surname: {
type: String,
required: true,
},
email: {
type: String,
required: true,
},
password: {
type: String,
required: true,
},
conversations: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "conversation",
},
],
date: {
type: Date,
default: Date.now,
},
});
module.exports = User = mongoose.model("user", UserSchema);

原因可能是newDatanewUser获取记录的搜索方法不同。您已经将User.findById用于newData,这显然将为不同的id返回不同的对象。但是User.findOneAndUpdate使用可能满足多个结果的过滤条件,但只返回第一个结果。因此,它大胆地取决于user字段是什么。

这是我改变的部分,并开始看到MongoDB上的数据:

await conversators.map(async (conversator) => {
let user = await User.findById(conversator);
let newData = user;
newData.conversations.push(conversation.id);

new Promise(async (resolve, reject) => {
user = await User.findOneAndUpdate(
{ id: conversator },
{
$set: {
newData,
},
},
{ new: true }
);
return resolve;
})
return await user.save();
});

代表提问者发表