在 Go 中使用页码和限制进行分页的好做法是什么?

amk*_*u91 0 go mongodb mgo

我使用页码和限制在 Go 中创建了分页。在哪里Limit & Page Number are INT

我创建了如下分页:

MONGO_SESSION.Find(nil).Skip(pageNumber*limit).Limit(limit).Sort("_id").All(&RETURN_STRUCT)
Run Code Online (Sandbox Code Playgroud)

它工作正常。但是当我发送页码或限制为零时。默认情况下 mongo DB 返回所有记录,因为没有什么可以跳过和限制的。

所以我的问题是,在零限制和零页码的情况下什么是好的做法。

练习 1:发送所有数据。不要发送错误响应。

实践二:发送错误响应说“页数和限制不能为零”

注意:我不能硬编码限制或页码。

任何建议将不胜感激。

icz*_*cza 5

这个问题有点基于意见(因此对于 StackOverflow 来说有点偏离主题),但我认为一些建议或一般实践可能对其他人有所帮助和有用。因此,以下答案是我的意见。

您作为服务器应用程序的开发人员负责服务器的安全和保障,以及服务器资源的利用。作为开发人员,您应该在必要的最低限度内信任客户。

也就是说,当客户未能指定限制(意外或故意)时发送所有文档是处理这种情况的最糟糕的方式。这就像尖叫:“嘿,客户和黑客,这是一个端点,如果你想对我的服务器进行DoS 攻击,只需多次调用这个端点”。

为了保护你的服务器,你应该有一个安全限制,即使是“limit”参数,因为允许它的任何值可能同样糟糕:仅仅因为你强制客户端指定一个限制并不能保护你的服务器,“坏”客户也可以发送一个限制1e9,其中很可能包括您的所有文件。

我的建议是始终有有意义的默认值安全限制。应始终记录默认值,安全限制不是那么重要(但也可以记录)。

那么你应该如何处理它:

  1. 如果缺少限制,则应用默认值。如果您不能拥有默认值,请跳过此步骤(尽管必须有充分的理由不拥有/允许默认值)。

  2. 应根据安全限制检查限制。如果超过安全值,则使用安全限值(最大允许限值)。

  3. 如果服务器“有权”更改请求的限制(例如,在缺少限制时使用默认值,或根据安全限制设置限制),则服务器应将实际用于服务的限制返回给客户端请求。

关于高效的 MongoDB 分页:我只建议使用Query.Skip()Query.Limit()用于“小”文档计数。对于随文档数量“缩放”的高效分页,请查看此问题+答案:使用 mgo 在 MongoDB 中进行有效分页