Express.js 是一个轻量级的 Node.js Web 框架,提供了丰富的功能和灵活的路由处理。在开发 Web 应用程序时,路由参数和查询字符串的处理是核心功能之一。本文将讨论 Express.js 中处理路由参数和查询字符串的最佳实践,帮助开发者更好地利用 Express.js 来构建高效的 Web 应用程序。
路由参数处理
路由参数是指在 URL 中通过指定参数名称来传递数据。在 Express.js 路由中,可以通过在路由路径中使用冒号(:)字符来定义参数名称。例如,以下路由定义了一个名为“id”的路由参数:
app.get('/user/:id', function (req, res) { res.send('user id: ' + req.params.id); });
当请求路径为 /user/123 时,响应体将输出 “user id: 123”。
最佳实践
在实际应用中,路由参数的值可能包含敏感信息或不可预测的字符,因此需要进行合理的验证和转换。以下是一些最佳实践:
- 定义合理的参数验证规则
在 Express.js 路由中,可以使用正则表达式或第三方库如 Joi 来定义路由参数的规则。例如,以下路由定义了一个必须为数字的“id”参数:
app.get('/user/:id([0-9]+)', function (req, res) { res.send('user id: ' + req.params.id); });
当请求路径为 /user/test 时服务器将返回 404 状态码,而 /user/123 将返回请求到的数据 。
- 进行参数转型
当路由参数需作为数字进行运算时,需要将字符串类型的参数转换为数字类型。在 Express.js 路由中,可以使用 parseInt 或 parseFloat 方法来进行转换。例如,以下路由请求路径 /user/123 将返回 246:
app.get('/user/:id', function (req, res) { res.send('user id: ' + (parseInt(req.params.id) * 2)); });
- 防止路径穿越攻击
当使用路由参数时,应该确保路由路径被限制在应用程序所需的范围内,防止路径穿越攻击。例如,以下路由定义将限制用户请求路径:
app.get('/content/*', function (req, res) { var filePath = path.join(__dirname, 'public', req.params[0]); if (filePath.indexOf(__dirname + '/public') !== 0) { return res.status(403).end(); } res.sendFile(filePath); });
查询字符串处理
查询字符串是指在 URL 中以 ? 字符开头的参数列表。在 Express.js 中,可以使用 req.query 对象访问查询字符串中的参数。
例如,以下路由可以处理 /search?q=keyword 请求:
app.get('/search', function (req, res) { res.send('search query: ' + req.query.q); });
最佳实践
在实际应用中,查询字符串可能包含多个参数,需要对其进行合理地处理。以下是一些最佳实践:
- 定义默认参数
当某些参数未在查询字符串中指定时,可以使用默认值进行处理。例如,以下代码将使用默认值 10 处理分页参数:
app.get('/articles', function (req, res) { var page = req.query.page || 1; var limit = req.query.limit || 10; // TODO: handle pagination });
- 避免使用不受信任的查询字符串参数名
如果查询字符串中某些参数可被用户指定,那么应该使用白名单机制来限制参数名。例如,以下代码只处理名为“type”的参数:
-- -------------------- ---- ------- -------------------- -------- ----- ---- - --- ----------- - --------- --- ------ - --- --------------------------------------- ----- - -- ------------------------- --- --- - ----------- - --------------- - --- -- ----- ------ ------ -- ------ ---
- 避免使用查询字符串传递较长的数据
查询字符串通常用于传递较短的数据,例如页面过滤和排序。如果需要传递较长的数据,例如请求体体积较大的 POST 请求,应该使用请求体来传递数据。在客户端和服务器之间的数据传输中,请求体具有更好的加密、压缩和容错机制。
// TODO: handle POST request with big body data
总结
路由参数和查询字符串是 Express.js 路由中的核心功能之一。在实际应用中,开发者需要遵循最佳实践,包括定义合理的参数验证规则、进行参数转型、防止路径穿越攻击、定义默认参数、避免使用不受信任的查询字符串参数名以及避免使用查询字符串传递较长的数据。这些实践将有助于开发者更好地利用 Express.js 来构建高效的 Web 应用程序。
参考示例代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ------------------ -------- ----- ---- - ---------------- ------ - - ------------- --- ---------------------------- -------- ----- ---- - -------------- --- - - --------------- --- -------------------- -------- ----- ---- - -------------- --- - - ------------------------ - ---- --- --------------------- -------- ----- ---- - --- -------- - -------------------- --------- --------------- -- --------------------------- - ---------- --- -- - ------ ---------------------- - ----------------------- --- -------------------- -------- ----- ---- - --- ---- - -------------- -- -- --- ----- - --------------- -- --- --------------- - - ---- - -- ------ - - ------- --- -------------------- -------- ----- ---- - --- ----------- - --------- --- ------ - --- --------------------------------------- ----- - -- ------------------------- --- --- - ----------- - --------------- - --- --------------------------------- --- ---------------- -------- -- - -------------------- --- --------- -- ---- -------- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d4a90bb5eee0b525c52395