node.js - 根据打字稿,Mongo $push 运算符不接受对象:“没有重载匹配此调用”
问题描述
我想用 Mongoose/Mongo 将消息推送到数组中。打字稿声称:
没有重载匹配此调用。重载 1 of 3, '(id: any, update: UpdateQuery, options: QueryOptions & { rawResult: true; }, callback?: ((err: any, doc: FindAndModifyWriteOpResultObject, res: any) => void) | undefined) : any',给出以下错误。输入'{消息:{消息:字符串;作者ID:字符串;}; }' 不可分配给类型 'PushOperator<_AllowStringsForIds<Pick<Pick<_LeanDocument, string | 号码 | 符号>,字符串 | 号码 | 符号>>>'。输入'{消息:{消息:字符串;作者ID:字符串;}; }' 不可分配给类型 'NotAcceptedFields<_AllowStringsForIds<Pick<Pick<_LeanDocument, string | 号码 | 符号>,字符串 | 号码 | 符号>>,只读任何[]>'。属性“消息”与索引签名不兼容。
这是代码片段:
const conversation = await Conversation.findByIdAndUpdate(
conversationId,
{
$push: { messages: { message, authorId } },
lastMessage: {
authorId,
snippet: `${message.substring(0, 47)}...`,
read: false,
},
},
{ new: true }
);
由于这个,构建崩溃。如何解决?
解决方案
这是类型不对齐的问题。
我的理解是,推送操作只能在之前代码中某个点显式定义为数组的字段上完成。
一个潜在的解决方案是显式设置集合的类型以包含您想要的字段(无论如何这是一个好习惯)。
所以,而不是类似的东西
const Conversations = database.collection('conversations');
您将明确定义“对话”文档的架构,然后键入集合:
import { Collection } from 'mongodb';
//...
type Conversation = {
messages: { message: String, authorId: Number }[],
//...
}
const Conversations: Collection<Conversation> = database.collection('conversations');
推荐阅读
- javascript - 引导文件输入表单提交
- python - 如果分类列在训练集中有多个值但在测试数据中只有一个值怎么办?这样的功能在模型训练中是否有用?
- css - 在 CSS Grid 中使用自动调整如何使一个单元格占据 2 列?
- javascript - 如何在点击时显示每个类元素?
- asp.net - 如何在asp中将缩短的url重定向(或重写url)到长(原始)url
- postgresql - Spring JPA 发现与 order by 不同
- numpy - sklearn 中的随机森林 - 分批预测与逐个预测
- sql - Vertica SQL - 包含子查询的 Agg 函数
- rest - 请放心,只有 GET Api 调用因 404 失败,但 post、put 等工作正常
- logging - 启用 DB2_CAPTURE_LOCKTIMEOUT=ON 后未找到 db2locktimeout 日志