当前位置: 首页 > 知识库问答 >
问题:

如何使用MongooseArray.prototype。pull()与typescript?

柴晔
2023-03-14

Typescript在这行抱怨道:

user.posts.pull(postId);

我得到这个错误:

     Property 'pull' does not exist on type 'PostDoc[]'

因为postId被接收为<code>req.params。postId</code>它是string类型,所以我将其转换为mongoose objectId,但仍然有相同的错误:

  user.posts.pull(mongoose.Types.ObjectId(postId));

pull() 在猫鼬数组中工作。这行代码是我在javacsript中实现的。我正在将我的项目转换为打字稿。这是用户模型的用户界面和架构。

interface UserDoc extends mongoose.Document {
  email: string;
  password: string;
  posts: PostDoc[];
  name: string;
  status: string;
}
const userSchema = new Schema({
  email: { type: String, required: true },
  password: { type: String, required: true },
  name: { type: String, required: true },
  status: { type: String, default: "I am a new user" },
  posts: [{ type: Schema.Types.ObjectId, ref: "Post" }],
});

这里发布架构和界面

interface PostDoc extends Document {
  title: string;
  content: string;
  imageUrl: string;
  creator: Types.ObjectId;
}
const postSchema = new Schema(
  {
    title: {
      type: String,
      required: true,
    },
    imageUrl: {
      type: String,
      required: true,
    },
    content: {
      type: String,
      required: true,
    },
    creator: {
      type: Schema.Types.ObjectId,
     ref: "User",
      required: true,
    },
  },
  { timestamps: true }

共有1个答案

柳奇希
2023-03-14

我遇到了一个类似的问题,无法正确键入子文档。为了保持DTO接口和模型接口的分离和强类型化,我建议您使用以下解决方案。这同样适用于您的PostDoc

interface UserDoc {
  email: string;
  password: string;
  posts: PostDoc[];
  name: string;
  status: string;
}
export type UserDocModel = UserDoc & mongoose.Document & PostDocModel & Omit<UserDoc , 'posts'>

interface PostDocModel {
  posts: mongoose.Types.Array<PostModel>;
};

对于< code>PostModel的mongoose数组,我们用Omit替换< code>posts: PostDoc[]属性,保持属性同步。来自https://stackoverflow.com/a/36661990的启示

通过这种方式,我们可以访问每个猫鼬数组方法,例如pullpopshift等(https://mongoosejs.com/docs/api.html#Array)

const user = await this.userdocModel.findById(userId).exec();
user.posts.pull(postId);
const User = mongoose.model<UserDocModel>('User', userSchema);
export default User;
 类似资料:
  • 问题内容: 我正在使用swift构建RSS阅读器,并且需要实现pull来重新加载功能。 这是我试图做到的方式。 我正进入(状态 : super.init调用未初始化属性“ self.refresh” 请帮助我了解手势识别器的行为。一个有效的示例代码将有很大的帮助。 谢谢。 问题答案: 拉动刷新 是iOS内置的。你可以像这样迅速 在某些时候,您可能会刷新。

  • 在 pull requests 使用“Work In Progress”标记 您可以通过在一个进行中的 pull request 的标题上添加前缀 WIP: 或者 [WIP](此处大小写敏感)来防止它被意外合并,具体的前缀设置可以在配置文件 app.ini 中找到: [repository.pull-request] WORK_IN_PROGRESS_PREFIXES=WIP:,[WIP] 列表

  • 问题内容: 使用github webhooks,我希望能够将任何更改拉到远程开发服务器。此刻,在适当的目录中时,需要进行任何更改。但是,我不知道如何在Python中调用该函数。我尝试了以下方法: 但这导致以下错误 追溯(最近一次呼叫最近): init errread,errwrite中的文件“ /usr/lib/python2.7/subprocess.py”中的文件“”,行679, )“ / u

  • 使用github webhooks,我希望能够对远程开发服务器进行任何更改。此时,在适当的目录中,将获得需要进行的任何更改。但是,我不知道如何从Python内部调用那个函数。我尝试了以下方法: 有没有办法让我从Python中调用这个bash命令?

  • 我是Vault的新手。我正在尝试使用APPROLE作为身份验证方法将Vault与Spring引导集成。我的bootstrap.yml配置如下: 当我使用此配置运行时。我出错了 org.springframework.beans.factory。BeanCreationException:创建名为“vaultTemplate”的bean时出错,该bean在类路径资源[org/springframew

  • 我做错了什么?