初入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”


2 回复

根据你的描述,你希望在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}`);
});

解释

  1. 监听POST请求:我们检查请求的方法是否为POST。
  2. 收集请求体:如果请求是POST类型,我们初始化一个空数组body来存储请求体的各个部分。
  3. 读取数据:使用req.on('data', callback)监听数据片段,并将它们推送到body数组中。
  4. 结束事件:当所有数据都被接收时(req.on('end')),我们将这些片段合并成完整的字符串,并设置响应头为Content-Type: text/plain,然后将数据作为响应体返回。
  5. 非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]}/`);
});

解释

  1. 监听 data 事件:当接收到 POST 请求的数据时,我们将其存储在数组 body 中。
  2. 监听 end 事件:当数据传输完成后,将数组中的所有片段拼接成完整的字符串,并设置响应头,然后输出响应体。
  3. 错误处理:如果请求方法不是 POST,则返回 405 错误码,并告知客户端发送一个 POST 请求。

这样可以确保从客户端接收到的所有 POST 数据都被正确收集并作为响应输出。

回到顶部