Node.js自定义HTTP服务器实现动态comments id参数路由求助
解决动态comments接口路由匹配问题
问题根源
当前路由系统是精确匹配完整URL(包含查询字符串),只有当请求URL完全等于/comments?id=1时才会触发处理逻辑,无法适配id为任意数字的情况。
解决方案
需要修改路由匹配逻辑,将URL的路径部分和查询参数部分分离,仅通过路径匹配路由,同时把查询参数解析后传递给处理函数。
1. 修改processRequest.js
引入Node.js内置的url模块,解析请求URL并分离路径与查询参数:
var http = require('http'); var url = require('url'); // 引入内置url模块 var criarProcessRequest = function(porta){ var entrada = {}; var caminhos = {}; var metodos = ['GET','POST']; metodos.forEach(function(metodo){ caminhos[metodo] = {}; entrada[metodo.toLowerCase()] = function(path,fn){ caminhos[metodo][path] = fn; }; }); http.createServer(function(req,res){ res.setHeader('Access-Control-Allow-Origin','*'); // 解析URL,分离路径和查询参数 const parsedUrl = url.parse(req.url, true); const pathname = parsedUrl.pathname; // 将查询参数挂载到req对象,方便后续调用 req.query = parsedUrl.query; // 仅根据路径匹配路由 if(!caminhos[req.method][pathname]){ res.statusCode = 404; return res.end(); } // 执行对应路由的处理函数 caminhos[req.method][pathname](req,res); }).listen(porta); return entrada; }; module.exports = criarProcessRequest;
2. 修改server.js中的comments路由
将路由路径改为/comments,并在处理函数中通过req.query.id获取动态id参数:
(async () => { const db = require("./database"); const users = await db.selectUsers(); console.log(users); const processRequest = require('./processRequest'); const aplicacao = processRequest(1234); aplicacao.get('/users',function(req,res){ res.write(JSON.stringify(users)); res.end(); }); // 修改为通用路径,适配任意id的请求 aplicacao.get('/comments',function(req,res){ const commentId = req.query.id; console.log(`进入comments处理逻辑,id为${commentId}`); // 此处可添加根据id查询数据库的业务逻辑 res.end(`获取到评论ID:${commentId}`); }); })();
测试验证
现在发送http://localhost:1234/comments?id=2、http://localhost:1234/comments?id=100这类请求,都会进入对应的comments处理逻辑,且能正确获取到动态id参数。
内容的提问来源于stack exchange,提问作者alex pestana
相关产品推荐
相关产品推荐

