2.14 留言数量

76 阅读1分钟

代码

post-content.ejs

修改views/components/post-content.ejs,在浏览下面添加留言:

image.png

<span>留言(<%= post.commentsCount %>)</span>

posts.schema.ts

修改src/posts/posts.schema.ts,添加一个commentsCount属性:

image.png

model.ts

修改src/model.ts,修改findMany方法,支持$in语法来使用数组进行查找。

type SimpleType = string | number | boolean;

type FindManyOptions<U> = {
  [K in keyof U]?: SimpleType | {
    $in: SimpleType[];
  };
};

async findMany(
    options: FindManyOptions<U>,
  ): Promise<U[]> {
    const docs = await this.findAll();
    return docs.filter((doc: any) => {
      return Object.keys(options).every((key) => {
        const k = key as keyof U;
        const opv = options[k];
        if (typeof opv === "object" && opv.$in) {
          return opv.$in.includes(doc[key]);
        } else {
          return doc[key] === opv;
        }
      });
    });
  }

comments.service.ts

src/comments/comments.service.ts,增加findByPostIds方法:

findByPostIds(postIds: string[]) {
    return this.model.findMany({
      postId: {
        $in: postIds,
      },
    });
  }

posts.service.ts

修改src/posts/posts.service.ts,findById增加一句:

image.png

formatPosts方法增加一段:

if (options.isWithComments) {
  const comments = await this.commentsService.findByPostIds(
    posts.map((post) => post.id),
  );
  posts.forEach((post) => {
    post.comments = comments.filter((comment) => comment.postId === post.id);
    post.commentsCount = post.comments.length;
  });
}

posts.controller.ts

修改src/posts/posts.controller.ts的getAll,增加一个参数:

image.png

验证

在博客下多加几条评论。

某篇博客效果:

image.png

所有博客效果:

image.png

作业

还差最后一步,我们的博客系统就基本完成了。

我们的错误信息是直接以字符串的形势返回的,我们可以提供一个错误页面。