MST

星途 面试题库

面试题:Node.js中复杂HTTP请求修改的实现

在Node.js的一个自定义HTTP服务器项目中,需要拦截所有发送到 /api 路径下的POST请求,修改请求体中的某个字段值(假设请求体是JSON格式,要修改其中 'name' 字段的值为 'new_name'),然后再将修改后的请求正常转发。请详细描述实现步骤,并给出完整的代码示例,同时说明可能遇到的问题及解决方案。
28.2万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

实现步骤

  1. 创建一个HTTP服务器。
  2. 监听 request 事件,判断请求的路径是否为 /api 且请求方法是否为 POST
  3. 读取请求体数据,因为请求体是JSON格式,所以读取完成后需要解析JSON数据。
  4. 修改解析后的JSON数据中的 name 字段值为 new_name
  5. 将修改后的JSON数据字符串化,然后重新设置请求体数据。
  6. 正常转发请求。

代码示例

const http = require('http');
const querystring = require('querystring');

const server = http.createServer((req, res) => {
    let body = '';
    if (req.url === '/api' && req.method === 'POST') {
        req.on('data', chunk => {
            body += chunk.toString();
        });
        req.on('end', () => {
            try {
                const jsonBody = JSON.parse(body);
                jsonBody.name = 'new_name';
                const newBody = JSON.stringify(jsonBody);
                // 这里实际上无法直接修改原请求体,只是构造新的请求体数据用于转发
                // 模拟转发请求,这里简单打印新的请求体数据
                console.log('New request body for forwarding:', newBody);
                res.writeHead(200, { 'Content-Type': 'application/json' });
                res.end(newBody);
            } catch (e) {
                res.writeHead(400, { 'Content-Type': 'text/plain' });
                res.end('Invalid JSON in request body');
            }
        });
    } else {
        // 非/api路径下的POST请求,正常处理
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('Not an /api POST request');
    }
});

const port = 3000;
server.listen(port, () => {
    console.log(`Server running on port ${port}`);
});

可能遇到的问题及解决方案

  1. 请求体解析失败:如果请求体不是合法的JSON格式,JSON.parse 会抛出错误。解决方案是在 JSON.parse 外面包裹 try...catch 块,如上述代码示例,捕获错误并返回合适的错误响应,告知客户端请求体格式有误。
  2. 数据丢失或损坏:在数据读取过程中,可能因为网络问题导致数据丢失或损坏。可以通过增加数据校验机制,例如计算数据的哈希值并在接收端验证。同时,确保合理设置 data 事件和 end 事件的处理逻辑,避免数据处理不完整。
  3. 转发请求问题:在实际应用中,真正的转发可能涉及到与其他服务器进行通信,可能会遇到跨域、连接超时等问题。对于跨域问题,可以在响应头中设置合适的跨域相关字段(如 Access-Control-Allow-Origin 等);对于连接超时问题,可以设置合理的超时时间,在请求超时时返回合适的错误信息给客户端。