📜  如何使用 Node.js 和 Express.js 在 REST API 中实现搜索和过滤?

📅  最后修改于: 2022-05-13 01:56:29.361000             🧑  作者: Mango

如何使用 Node.js 和 Express.js 在 REST API 中实现搜索和过滤?

搜索和过滤是 API 必须具备的非常基本的功能,才能有效地向客户端应用程序提供数据。通过在服务器端处理这些操作,我们可以减少必须在客户端应用程序上完成的处理量,从而提高其性能。

一种非常流行的实现方式是借助查询字符串。查询字符串是 URL 的一部分,它允许我们以参数及其值的形式将数据从客户端传递到服务器,反之亦然。

句法:

http://test.com?name=John&age=21

这里,问号(?)后面的部分是查询字符串。这些基本上是我们可以用于各种目的的键值对。在本文中,我们将了解如何构建一个可以接受这些查询字符串的 Node.js REST API,根据这些提供的参数过滤用户列表,然后返回匹配结果。

设置项目:

  • 首先,我们必须使用 Node Package Manager 初始化一个新项目。我们可以通过选择所有默认选项来完成设置。

    npm init
  • 接下来,我们要安装 express 包。

    npm install express --save

此应用程序的入口点将是app.js文件。我们所有的业务逻辑都会放在这里。 REST API 将只包含一个返回用户列表的路由,并支持使用查询字符串进行搜索和过滤。

示例:最初,app.js 文件看起来像这样,路由只返回一条基本消息。

app.js
const express = require('express');
const data = require('./data');
  
// Initialize App
const app = express();
  
// Assign route
app.use('/', (req, res, next) => {
  res.send('Node.js Search and Filter');
});
  
// Start server on PORT 5000
app.listen(5000, () => {
  console.log('Server started!');
});


data.js
const data = [
  { id: 1, name: 'Alan Wake', age: 21, city: 'New York' },
  { id: 2, name: 'Steve Rogers', age: 106, city: 'Chicago' },
  { id: 3, name: 'Tom Hanks', age: 47, city: 'Detroit' },
  { id: 4, name: 'Ryan Burns', age: 16, city: 'New York' },
  { id: 5, name: 'Jack Ryan', age: 31, city: 'New York' },
  { id: 6, name: 'Clark Kent', age: 34, city: 'Metropolis' },
  { id: 7, name: 'Bruce Wayne', age: 21, city: 'Gotham' },
  { id: 8, name: 'Tim Drake', age: 21, city: 'Gotham' },
  { id: 9, name: 'Jimmy Olsen', age: 21, city: 'Metropolis' },
  { id: 10, name: 'Ryan Burns', age: 21, city: 'New York' },
];
  
module.exports = data;


app.js
const express = require('express');
const data = require('./data');
  
// Initialize App
const app = express();
  
// Assign route
app.use('/', (req, res, next) => {
  const filters = req.query;
  const filteredUsers = data.filter(user => {
    let isValid = true;
    for (key in filters) {
      console.log(key, user[key], filters[key]);
      isValid = isValid && user[key] == filters[key];
    }
    return isValid;
  });
  res.send(filteredUsers);
});
  
// Start server on PORT 5000
app.listen(5000, () => {
  console.log('Server started!');
});


添加模拟数据:为了进行搜索和过滤,我们需要一些模拟数据,即我们可以执行这些操作的用户列表。为此,我们可以创建一个单独的文件data.js

数据.js

const data = [
  { id: 1, name: 'Alan Wake', age: 21, city: 'New York' },
  { id: 2, name: 'Steve Rogers', age: 106, city: 'Chicago' },
  { id: 3, name: 'Tom Hanks', age: 47, city: 'Detroit' },
  { id: 4, name: 'Ryan Burns', age: 16, city: 'New York' },
  { id: 5, name: 'Jack Ryan', age: 31, city: 'New York' },
  { id: 6, name: 'Clark Kent', age: 34, city: 'Metropolis' },
  { id: 7, name: 'Bruce Wayne', age: 21, city: 'Gotham' },
  { id: 8, name: 'Tim Drake', age: 21, city: 'Gotham' },
  { id: 9, name: 'Jimmy Olsen', age: 21, city: 'Metropolis' },
  { id: 10, name: 'Ryan Burns', age: 21, city: 'New York' },
];
  
module.exports = data;

使用查询字符串:

  • 让我们考虑这个 URL。在这里,我们要获取所有居住在 Metropolis 且年龄为 21 岁的用户。

    http://localhost:5000?city=Metropolis&age=21
  • 我们可以使用res对象的query属性来访问查询字符串

    console.log(res.query)
    >> { city: 'Metropolis', age: '21' }

我们可以看到它包含了所有通过 URL 以键值对形式传递的参数。要将这些参数应用于我们的用户列表,我们可以使用 Array.filter() 方法并检查每个用户是否满足所有提供的参数,如果满足,则将其添加到过滤用户列表中。

filterUsers列表是我们的最终结果,可以作为响应返回。最终代码如下

应用程序.js

const express = require('express');
const data = require('./data');
  
// Initialize App
const app = express();
  
// Assign route
app.use('/', (req, res, next) => {
  const filters = req.query;
  const filteredUsers = data.filter(user => {
    let isValid = true;
    for (key in filters) {
      console.log(key, user[key], filters[key]);
      isValid = isValid && user[key] == filters[key];
    }
    return isValid;
  });
  res.send(filteredUsers);
});
  
// Start server on PORT 5000
app.listen(5000, () => {
  console.log('Server started!');
});

例子

  1. URL:获取id为2的用户

    http://localhost:5000?id=2

    输出:

    [
       {
           "id": 2,
           "name": "Steve Rogers",
           "age": 106,
           "city": "Chicago"
       }
    ]
  2. URL:获取所有住在 Metropolis 的用户

    http://localhost:5000?city=Metropolis

    输出:

    [
        {
            "id": 6,
            "name": "Clark Kent",
            "age": 34,
            "city": "Metropolis"
        },
        {
            "id": 9,
            "name": "Jimmy Olsen",
            "age": 21,
            "city": "Metropolis"
        }
    ]
  3. URL:获取所有居住在 Metropolis 且年满 21 岁的用户

    http://localhost:5000?city=Metropolis&age=21

    输出

    [
       {
           "id": 9,
           "name": "Jimmy Olsen",
           "age": 21,
           "city": "Metropolis"
       }
    ]