在 Node 中解析请求体
node.jsserver side programmingprogramming
之前在一个简单的代码示例中,我们了解了如何路由请求以及如何创建文件来输入测试数据。
现在,我们需要将用户输入的数据保存到文本文件中。
Node.js 如何处理传入的请求数据
Node.js 以分块方式读取数据,这意味着它使用流来读取数据。一旦 Node 完成请求数据的读取,我们就可以继续使用它来实现我们的目的。
首先以分块方式读取数据 const requestBody = []; req.on(‘data’, (chunks)=>{ requestBody.push(chunks); });
我们在传入的 http 请求上注册了一个名为 ‘data’ 的事件。此事件将继续流式传输数据并推送到 requestBody const 变量。
附加整个请求数据 数据完成后,我们将使用 ‘end ’ 事件将接收到的数据转换为字符串。 req.on(‘end’, ()=>{ const parsedData = Buffer.concat(requestBody).toString(); });
我们以键值对的形式获取请求参数。我们需要对其进行拆分,以便将值保存到文本文件中。
const username = parsedData.split(‘=’)[1];
完整的 App.js 文件包含用于保存用户输入名称的代码,如下所示 −
const http = require('http'); const fs = require('fs'); const server = http.createServer((req, res)=>{ const url = req.url; if(url === '/'){ res.write('<html>'); res.write('<head> <title> Hello TutorialsPoint </title> </head>'); res.write(' <body> <form action="/username" method="POST"> <input type="text" name="username"/> <button type="submit">Submit</button> </body>'); res.write('</html>'); return res.end(); } if(url === '/username' && req.method === 'POST'){ const requestBody = []; req.on('data', (chunks)=>{ requestBody.push(chunks); }); req.on('end', ()=>{ const parsedData = Buffer.concat(requestBody).toString(); const username = parsedData.split('=')[1]; fs.writeFileSync('username.txt', username); }); //redirect res.statusCode=302; res.setHeader('Location','/'); return res.end(); } res.write('<html>'); res.write('<head> <title> Hello TutorialsPoint </title> </head>'); res.write(' <body> Hello </body>'); res.write('</html>'); res.end(); }); server.listen(3000); Note that we wrote file write operation inside end event : req.on('end', ()=>{ const parsedData = Buffer.concat(requestBody).toString(); const username = parsedData.split('=')[1]; fs.writeFileSync('username.txt', username); });
这是因为,我们希望先完成结束事件以获取用户名,然后再将其写入文件。
现在,这是使用核心 node.js 的背景,在 Express.js 中以更简单的方式处理所有这些解析逻辑会更容易。
我们将在接下来的文章中介绍 express.js 处理请求解析的方式。