NodeJS异步API错误,当查询嵌入的模型数组



感谢您花时间阅读本文。当调用此异步端点时,我目前在节点express的API端点中得到此错误。

(node:32308) UnhandledPromiseRejectionWarning: ValidationError: Conversation validation failed: participants.0: Path `participants.0` is required., participants.1: Path `participants.1` is required.
at model.Document.invalidate (D:cliquenextflutterstashifybackendnode_modulesmongooselibdocument.js:2976:32)
at D:cliquenextflutterstashifybackendnode_modulesmongooselibdocument.js:2765:17
at D:cliquenextflutterstashifybackendnode_modulesmongooselibschematype.js:1334:9
at processTicksAndRejections (internal/process/task_queues.js:79:11)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:32308) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)        
(node:32308) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

基本上我试图得到一个对话,它的消息和它的参与者,并返回它。对话对象模型如下所示:

const conversationSchema = new Schema(
{
isGroup: {
type: Boolean,
required: true,
},
creator: {
type: Schema.Types.ObjectId,
ref: 'User',
},
passwordProtected: {
type: Boolean,
default: false,
},
password: {
type: String,
},
participants: [
{
type: Schema.Types.ObjectId,
ref: 'User',
required: true,
},
],
deleted: [
{
type: Schema.Types.ObjectId,
ref: 'User',
},
],
seen: [
{
type: Schema.Types.ObjectId,
ref: 'User',
},
],
messages: [
{
type: Schema.Types.ObjectId,
ref: 'Message',
},
],
},
{ timestamps: true },
);

这是我的端点:

exports.getMessagesFromUser = async (req, res, next) => {
try {
// variables
const senderId = req.userId;
const receiverId = req.body.receiverId;
// get users
const sender = await User.findOne({ _id: senderId });
const receiver = await User.findOne({ _id: receiverId });
const ids = [senderId, receiverId];
// look for an existing conversation between two users
// where the participants include both users
// where the conversation is a single conversation
// that the sender hasn't deleted
// if sender chooses to send a message, any undeleted conversations will be resurrected
let conversation = await Conversation.findOne({
isGroup: false,
participants: {
$all: ids,
},
})
.select('participants deleted seen messages')
.populate({ path: 'messages', select: 'sender message deleted seen createdAt' })
.populate({ path: 'participants', select: '_id' })
.populate({ path: 'participants', select: 'nickname' });
if (conversation) {
// conversation exists
let senderBlocked = false;
let receiverBlocked = false;
let conversationDeleted = false;
let filter;
// check if sender has blocked the receiver
filter = sender.blocked.filter((u) => u._id == receiverId);
if (filter.length > 0) {
senderBlocked = true;
}
filter = null;
// check if receiver has blocked the sender
filter = receiver.blocked.filter((u) => u._id == senderId);
if (filter.length > 0) {
receiverBlocked = true;
}
filter = null;
// check if sender has deleted the conversation
filter = conversation.deleted.filter((u) => u._id == senderId);
if (filter.length > 0) {
conversationDeleted = true;
}
// get, map and return the messageSchema
res.status(200).json({
message: 'Conversations fetched successfully!',
conversation: conversation,
senderBlocked: senderBlocked,
receiverBlocked: receiverBlocked,
conversationDeleted: conversationDeleted,
});
} else {
// if conversation does not exist, return empty array
// conversations will be created upon initial message between users
res.status(200).json({
message: 'No Conversations Yet.',
conversation: [],
senderBlocked: false,
receiverBlocked: false,
conversationDeleted: false,
});
}
} catch (e) {
e.statusCode = 500;
next(e);
}
};

我能够确定这个错误是在这个端点内抛出的,但我的生命无法找出原因。我添加了try, catch和next block。确保我有适当的等待顺序,等等。我唯一的猜测是猫鼬查询填充和选择是错误的?你觉得我哪里做错了?请和谢谢你。

正如jimmy指出的,问题并不在这里。这是在另一个套接字路由,我试图保存新的对话,如果他们不存在。

所以我有这样的东西:

socket.on('join-inbox-rooms', async (data) => {
// decode json string
const decodedData = await JSON.parse(data);
// get conversation
let conversation = await Conversation.findOne({
isGroup: false,
participants: {
$all: [decodedData.senderId, decodedData.receiverId],
},
});
if (!conversation) {
conversation = new Conversation({
isGroup: false,
creator: decodedData.senderId,
passwordProtected: false,
paassword: null,
participants: [
decodedData.senderId,
decodedData.receiverId,
],
deleted: [],
seen: [],
messages: [],
});
await conversation.save();
}

现在我从前端获得id作为字符串。它们应该是mongo对象。

我最终像这样修复它:

const { ObjectId } = require('mongodb');
if (!conversation) {
conversation = new Conversation({
isGroup: false,
creator: decodedData.senderId,
passwordProtected: false,
paassword: null,
participants: [
ObjectId(decodedData.senderId),
ObjectId(decodedData.receiverId),
],
deleted: [],
seen: [],
messages: [],
});
await conversation.save();
}

最新更新