【问题标题】:How to get the document count on the front end using Angular Material Paginator with a node js backend connecting to a SQL database?如何使用 Angular Material Paginator 和连接到 SQL 数据库的节点 js 后端获取前端的文档计数?
【发布时间】:2020-12-26 16:08:48
【问题描述】:

我目前正在尝试使分页器的逻辑正确。我已经到了返回文档并显示每页正确数量的文档的地步,但是我似乎无法让页数部分正常工作,它没有更新超过 0 的 0。我正在使用的数据库是带有sequelize的MySQL。

这是我以 html 文件开头的代码。

   <mat-paginator color="accent" [length]="totalBlogs" [pageSize]="blogsPerPage" 
  [pageSizeOptions]="pageSizeOptions" (page)="onChangedPage($event)" *ngIf="blogs.length > 0"> 
   </mat-paginator>

这是我使用分页器的组件中的代码。

totalBlogs = 0;
   blogsPerPage = 2;
   pageSizeOptions = [1, 2, 5, 10];
   currentPage = 1;

   


  constructor(
    private authService: AuthService,
    private blogService: BlogService
  ) { }

  ngOnInit() {
    this.isLoading = true;
    this.blogService.getBlogs(this.blogsPerPage, this.currentPage);
    this.userId = this.authService.getUserId();
    this.blogSubs = this.blogService.getBlogUpdateListener()
    .subscribe((blogData: { blogs: Blog[], blogCount: number}) => {
      this.isLoading = false;
      this.totalBlogs = blogData.blogCount;
      this.blogs = blogData.blogs;
    });
  }
  onChangedPage(pageData: PageEvent) {
    console.log(pageData);
    this.isLoading = true;
    this.currentPage = pageData.pageIndex + 1;
    this.blogsPerPage = pageData.pageSize;
    this.blogService.getBlogs(this.blogsPerPage, this.currentPage);
  }

服务文件的代码如下。

getBlogs(blogsPerPage: number, currentPage: number) {
    const queryParams = `?pagesize=${blogsPerPage}&page=${currentPage}`;
    this.http.get<{ message: string, blogs: any, maxBlogs: number}>(
      BACKEND + 'all/blogs/' + queryParams/* ,
      { headers: header } */
    ).pipe(map((blogData) => {
      return {
        blogs: blogData.blogs.map((blog: {
          id: string;
          title: string;
          description: string;
          date: string;
          author: string;
          user_id: string;
          is_deleted: string;
        }) => {
          return {
            id: blog.id,
            title: blog.title,
            description: blog.description,
            date: blog.date,
            author: blog.author,
            userId: blog.user_id,
            is_deleted: blog.is_deleted
          }
        }), maxBlogs: blogData.maxBlogs
      }
    })
    ).subscribe(transformedBlogsData => {
      this.blogs = transformedBlogsData.blogs;
      this.blogsUpdated.next({
        blogs: [...this.blogs],
        blogCount: transformedBlogsData.maxBlogs
      });
    });
  }

最后,当我加载带有分页器的页面时,在从 PageEvent 记录 pageData 时,我在控制台中得到以下信息。

【问题讨论】:

    标签: angular


    【解决方案1】:

    首先,请澄清它的MS Sql MY Sql,我假设它的MY Sql 给你一个示例。 其次,这不是一个文档数据库,它是一个关系/RDB,所以你会有一个行数或结果数。


    Node JS 后端的计数

    var mysql = require('mysql');
     
    var connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        password: '',
        database: 'yourDataBase',
        debug: false,
    });
     
    console.log("Connected to Mysql");
    connection.connect();
     
    var sql = "SELECT * FROM myBLogsTable";
    
    var totalRows;
    var totalPageCount;
     
    var query = connection.query(sql, function(err, result) {
        // This is your total row/document count
        console.log("Total Records:- " + result.length);
        // here you can get the total results & page count, send this back to angular front end. Just make sure its not div/zero error.
        // totalPageCount = result.length/blogsPerPage;
    });
     
    connection.end();
    

    回答您关于结果大小的问题

    //use length For select query.
    connection.query(sql, [x,y], function(err, results) {
        numRows = results.length;
    });
    
    //Use affectedRows for an CUD query.
    connection.query(sql, [var1,var2], function(err, result) {
        numRows = result.affectedRows;
    });
    

    对于像这样来自here..的分页

    router.get('/?', function(req, res, next) {
        const sql = "SELECT * from users ";
        const existingParams = ["title", "active"].filter(field => req.query[field]);
        const pageNum = req.query.p || 1;
        const pageSize = req.query.p_size || 100;
    
    
        if (existingParams.length) {
            sql += " WHERE ";
            sql += existingParams.map(field => `${field} = ?`).join(" AND ");
        }
        sql += ` LIMIT  ${(pageNum - 1) * PageSize},${PageSize}`;
        ...
    });
    

    【讨论】:

    • 抱歉,我使用的是 MySQL Workbench 数据库,在本地进行续集,而对于生产,我使用的是 AWS MySQL RDS 并进行续集。
    • @ThomasKremer 这对你不起作用.. 你试过这些选项吗
    • 我相信它会起作用的。 @transformer,正如我所说,我对编码和兼职工作非常陌生。我已经觉得问这些明显简单的问题对这里的许多开发人员来说都是一个麻烦。我将通读您告诉我的内容,并在本周末尝试实施。感谢您的时间和指导,非常感谢。
    • @ThomasKremer 不要感觉太糟糕,一切都很好。如果有效,请将其标记为答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2020-04-06
    • 2019-05-27
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多