如何将分页应用于 json-server 中的子对象?

Posted

技术标签:

【中文标题】如何将分页应用于 json-server 中的子对象?【英文标题】:How can I apply pagination to a subobject in json-server? 【发布时间】:2021-09-23 11:42:39 【问题描述】:

我有一个json-server,其中包含以下文件:

db.json:

var faker = require('faker');

module.exports = function () 
    var data = 
        slack_users_list: slack_users_list(),
        slack_users_info: slack_users_info()
    

    return data;


function slack_users_list() 
    const data = 
        members: []
    

    for (var i = 0; i < 10; i++) 
        data.members.push(
            id: "user_id_" + i
        )
    

    return data;


function slack_users_info() 
    const data = 
        user: []
    

    for (var i = 0; i < 10; i++) 
        data.user.push(
            id: "user_id_" + i,
            name: faker.internet.userName(),
            team_id: faker.datatype.string(),
            profile: 
                title: faker.name.title(),
                first_name: faker.name.firstName(),
                last_name: faker.name.lastName(),
                title: faker.name.title(),
                email: faker.internet.email(),
                phone: faker.phone.phoneNumber(),
                skype: faker.internet.userName(),
            ,
        )
    

    return data;

还有server.js:

const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router(require('./db.js')())
const middlewares = jsonServer.defaults()

server.use(middlewares)


server.use(jsonServer.bodyParser)

// Wrap response depending on the object being called.
router.render = (req, res) => 

    if (req.url.startsWith('/slack_users_list')) 
        res.jsonp(res.locals.data)

     else if (req.url.startsWith('/slack_users_info')) 
        param_user = req.query.user

        if (param_user == null) 
            res.jsonp(
                "ok": false,
                "error": "user_not_found"
            )
            return
        

        user_list = res.locals.data.user
        user_info = 
        for (var i = 0; i < user_list.length; i++) 
            if (user_list[i].id == param_user) 
                user_info = user_list[i]
            
        
        res.jsonp( user: user_info )

     else 
        res.jsonp(res.locals.data)
    


server.use(router)

// Run server on indicated port.
server.listen(port = 3000, () => 
    console.log('JSON Server is running')
    console.log('http://localhost:' + port)
)

所以当我打电话给http://localhost:3000/slack_users_list 我得到:


  "members": [
    
      "id": "user_id_0"
    ,
    
      "id": "user_id_1"
    ,
    
      "id": "user_id_2"
    ,
    
      "id": "user_id_3"
    ,
    
      "id": "user_id_4"
    ,
    
      "id": "user_id_5"
    ,
    
      "id": "user_id_6"
    ,
    
      "id": "user_id_7"
    ,
    
      "id": "user_id_8"
    ,
    
      "id": "user_id_9"
    
  ]

但是如果我想对其应用分页(例如http://localhost:3000/slack_users_list?_page=1&amp;_limit=2),我会得到所有相同的对象,我假设是因为分页被应用到对象的第一行而不是成员中的每个元素在 db.json 中生成。

如何修改它以将分页应用于子对象members

谢谢!

【问题讨论】:

“Devices”关键字是 const 还是您希望 json-server 在“saas_1”内的所有数组/第一个数组上动态执行此操作? 嗨@dWinder,对不起,如果你想再看一遍,我用一个更好的例子编辑了这篇文章。关键字(现在更改为成员)对于该端点是恒定的。因此,如果我应用分页,我仍然希望在该对象下获得所有结果。 【参考方案1】:

您可以在发送响应之前进行分页。

// !!!
// This is just for demonstration.

// consider this req as the actual request.(req, res)
const req = 
    params:  _page: '2', _limit:'3'


// consider this as actual slack_users_list.members
const members = [
    
      "id": "user_id_0"
    ,
    
      "id": "user_id_1"
    ,
    
      "id": "user_id_2"
    ,
    
      "id": "user_id_3"
    ,
    
      "id": "user_id_4"
    ,
    
      "id": "user_id_5"
    ,
    
      "id": "user_id_6"
    ,
    
      "id": "user_id_7"
    ,
    
      "id": "user_id_8"
    ,
    
      "id": "user_id_9"
    
]


const page=Number(req.params._page)
const limit=Number(req.params._limit)

// paginating
const limited = members.slice((page - 1) * limit, page * limit)

console.log(limited)

// // send paginated response
//res.json(limited)

【讨论】:

我的回答解决了你的问题吗?让我知道 (✓) 是的。这就是我最终或多或少地做的事情,因为我找不到使原始参数起作用的方法。感谢您的回答。

以上是关于如何将分页应用于 json-server 中的子对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用管道将分页添加到 dataflowjob 中的 Bigquery 查询

将分页信息传递给RestController的最佳方法是什么?

如何将分页数据和数组从控制器 laravel 传递到 vue 组件?

Spring JPA:使用分页查找多个 ID

我在使用 React JS 中的状态时遇到分页问题

将分页 UICollectionView 高度调整为当前可见的 UICollectionViewCell