如何使用 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!');
});
例子
URL:获取id为2的用户
http://localhost:5000?id=2
输出:
[ { "id": 2, "name": "Steve Rogers", "age": 106, "city": "Chicago" } ]
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" } ]
URL:获取所有居住在 Metropolis 且年满 21 岁的用户
http://localhost:5000?city=Metropolis&age=21
输出
[ { "id": 9, "name": "Jimmy Olsen", "age": 21, "city": "Metropolis" } ]