初入Nodejs,被一个题困惑了,求解答
初入Nodejs,被一个题困惑了,求解答
此题来自nodeschool第二个教学模块Stream Adventure,这个题是第七题HTTP SERVER 题目的要求是把通过浏览器POST进来的内容直接输出给浏览器
我的实现如下
var server = http.createServer(function(req,res){
if(req.method == 'POST'){
req.pipe(tr).pipe(res);
}else{
res.end('please send a post request');
}
});
server.listen(Number(process.argv[2]));
\n```
但很可惜通不过测试
ACTUAL EXPECTED
“YET” “YET”
“HOW” “HOW”
“TO” “TO”
“BURGEON.” “BURGEON.”
“IT’S” “IT’S”
“MEANT” !== “MILLIEMS”
“YET” !== “MEANT”
“HOW” !== “OF”
“TO” !== “MILLIEMS”
“BURGEON.” !== “CENTIMENTS”
“IT’S” !== “OF”
“MILLIEMS” !== “DEADLOST”
“MEANT” !== “CENTIMENTS”
“OF” !== “OR”
“MILLIEMS” !== “DEADLOST”
“CENTIMENTS” !== “MISLAID”
“OF” !== “OR”
“DEADLOST” !== “ON”
“CENTIMENTS” !== “MISLAID”
“OR” !== “THEM”
“DEADLOST” !== “ON”
“MISLAID” !== “BUT,”
“OR” !== “THEM”
“ON” !== “MASTER”
“MISLAID” !== “OF”
“THEM” !== “BUT,”
“ON” !== “MASTER”
根据你的描述,你希望在Node.js中创建一个HTTP服务器,将通过浏览器POST请求发送的内容直接返回给客户端。你的代码逻辑基本上是对的,但可能有一些细节需要调整。
问题分析
你的代码尝试使用req.pipe()
来处理请求数据并将其直接传递回响应对象。然而,从错误信息来看,实际输出的内容与预期不符,这可能是由于处理方式或数据流管理上的一些小问题导致的。
解决方案
我们可以改进代码,确保正确地捕获并返回POST请求的数据。这里是一个更简洁、有效的实现方法:
const http = require('http');
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
let body = [];
req.on('data', chunk => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(body);
});
} else {
res.writeHead(405, {'Content-Type': 'text/plain'});
res.end('Please send a POST request.');
}
});
const port = process.argv[2] || 3000;
server.listen(port, () => {
console.log(`Server is listening on port ${port}`);
});
解释
- 监听POST请求:我们检查请求的方法是否为POST。
- 收集请求体:如果请求是POST类型,我们初始化一个空数组
body
来存储请求体的各个部分。 - 读取数据:使用
req.on('data', callback)
监听数据片段,并将它们推送到body
数组中。 - 结束事件:当所有数据都被接收时(
req.on('end')
),我们将这些片段合并成完整的字符串,并设置响应头为Content-Type: text/plain
,然后将数据作为响应体返回。 - 非POST请求处理:如果请求不是POST类型,则返回一个405状态码和相应的消息提示用户发送POST请求。
这种方法确保了所有POST请求的数据能够被正确地捕捉并返回给客户端。
根据你的描述,题目要求的是将通过浏览器 POST 请求的内容直接输出到响应中。你的代码逻辑基本正确,但可能缺少一些关键部分来确保请求体能够被正确读取和处理。
以下是一个改进后的示例代码:
const http = require('http');
var server = http.createServer((req, res) => {
if (req.method === 'POST') {
let body = [];
req.on('data', chunk => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(body);
});
} else {
res.writeHead(405, { 'Content-Type': 'text/plain' });
res.end('please send a POST request');
}
});
server.listen(Number(process.argv[2]), () => {
console.log(`Server running at http://localhost:${process.argv[2]}/`);
});
解释
- 监听
data
事件:当接收到 POST 请求的数据时,我们将其存储在数组body
中。 - 监听
end
事件:当数据传输完成后,将数组中的所有片段拼接成完整的字符串,并设置响应头,然后输出响应体。 - 错误处理:如果请求方法不是 POST,则返回 405 错误码,并告知客户端发送一个 POST 请求。
这样可以确保从客户端接收到的所有 POST 数据都被正确收集并作为响应输出。