【问题标题】:Mongoose/TypeScript $addToSet, $push and $pull errorsMongoose/TypeScript $addToSet、$push 和 $pull 错误
【发布时间】:2021-08-11 15:29:44
【问题描述】:

我有一个将“userId”订阅到 threadId 的函数,如下所示:

 suscribeToThread: async (threadId: IThread["_id"], userId: IUser["_id"]) => {
    return await threadModel.updateOne(
      { _id: threadId },
      { $addToSet: { suscribers: userId } }
    );
},

我收到以下错误:

Type '{ suscribers: string; }' is not assignable to type '{ readonly [x: string]: any; readonly [x: number]: any; } & NotAcceptedFields<_AllowStringsForIds<LeanDocument<any>>, readonly any[]> & { readonly [key: string]: any; } & { readonly id?: any; ... 4 more ...; readonly replies?: string | AddToSetOperators<...>; } & NotAcceptedFields<...>'.
  Type '{ suscribers: string; }' is not assignable to type 'NotAcceptedFields<_AllowStringsForIds<LeanDocument<any>>, readonly any[]>'.
    Property 'suscribers' is incompatible with index signature.
      Type 'string' is not assignable to type 'never'.ts(2322)

这个错误只发生在 $addToSet、$push 和 $pull 操作符上。

这是线程模型的模型/接口

import mongoose, { Document, Schema } from "mongoose";
import { IComment } from "../comment/commentModel";
import { IUser } from "../user/userModel";

export interface IThread extends Document {
  _id: string;
  title: string;
  timestamp: number;
  author: IUser["_id"];
  content: string;
  locked: boolean;
  sticky: boolean;
  likedBy: Array<IUser["_id"]>;
  dislikedBy: Array<IUser["_id"]>;
  viewedBy: Array<IUser["_id"]>;
  suscribers: Array<IUser["_id"]>;
  replies: Array<IComment["_id"]>;
}

const ThreadSchema = new mongoose.Schema({
  title: String,
  timestamp: { type: Date, default: Date.now },
  author: { type: Schema.Types.ObjectId, ref: "User" },
  content: String,
  locked: { type: Boolean, default: false },
  sticky: { type: Boolean, default: false },
  likedBy: [{ type: Schema.Types.ObjectId, ref: "User", default: [] }],
  dislikedBy: [{ type: Schema.Types.ObjectId, ref: "User", default: [] }],
  viewedBy: [{ type: Schema.Types.ObjectId, ref: "User", default: [] }],
  suscribers: [{ type: Schema.Types.ObjectId, ref: "User", default: [] }],
  replies: [{ type: Schema.Types.ObjectId, ref: "Comment", default: [] }],
});

export default mongoose.models.Thread ||
  mongoose.model<IThread>("Thread", ThreadSchema);

我可以使用 ts-ignore 忽略错误,一切正常,但我认为这不是正确的方法。任何帮助将不胜感激!

【问题讨论】:

  • 尝试使用mongoose.Types.ObjectId 而不是Schema.Types.ObjectId 例如。 suscribers: [{ type: mongoose.Types.ObjectId, ref: "User", default: [] }],
  • @TusharGupta-curioustushar 仍然给我同样的错误
  • 请提供文档架构
  • @GandalftheWhite 你能详细说明一下吗?
  • Documentexport interface IThread extends Document => Document 的架构。

标签: node.js typescript mongodb mongoose


【解决方案1】:

suscribeToThread 函数:

import mongoose from "mongoose";

suscribeToThread: async (threadId: IThread["_id"], userId: IUser["_id"]) => {
        return await threadModel.updateOne(
          { _id: threadId },
          { $addToSet: { suscribers: new mongoose.Types.ObjectId(userId) } }
        );
    }

线程模型:

import mongoose, { Document, Schema } from "mongoose";
import { IComment } from "../comment/commentModel";
import { IUser } from "../user/userModel";

export interface IThread extends Document {
    _id: string;
    title: string;
    timestamp: number;
    author: IUser["_id"];
    content: string;
    locked: boolean;
    sticky: boolean;
    likedBy: Array<IUser["_id"]>;
    dislikedBy: Array<IUser["_id"]>;
    viewedBy: Array<IUser["_id"]>;
    suscribers: Array<IUser["_id"]>;
    replies: Array<IComment["_id"]>;
}

const ThreadSchema = new mongoose.Schema({
    title: String,
    timestamp: { type: Date, default: Date.now },
    author: { type: Schema.Types.ObjectId, ref: "User" },
    content: String,
    locked: { type: Boolean, default: false },
    sticky: { type: Boolean, default: false },
    likedBy: {
        type: [mongoose.Types.ObjectId],
        ref: "User",
        default: []
    },
    dislikedBy: {
        type: [mongoose.Types.ObjectId],
        ref: "User",
        default: []
    },
    viewedBy: {
        type: [mongoose.Types.ObjectId],
        ref: "User",
        default: []
    },
    suscribers: {
        type: [mongoose.Types.ObjectId],
        ref: "User",
        default: []
    },
    replies: {
        type: [mongoose.Types.ObjectId],
        ref: "User",
        default: []
    }
});

export default mongoose.models.Thread || mongoose.model < IThread > ("Thread", ThreadSchema);

您需要将 userId 转换为 ObjectId。它是字符串类型,所以打字稿会抛出错误。

【讨论】:

  • 您的解决方案出现此错误:(property) suscribers?: string | AddToSetOperators 类型 '_ObjectId' 不可分配给类型 'string | AddToSetOperators'。 “_ObjectId”类型中缺少属性“$each”,但在“AddToSetOperators”类型中是必需的
  • 您能否检查一下架构是否就像答案中显示的那样?
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 2014-08-09
  • 2020-08-18
  • 2021-07-31
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多