NodeJS 服务器 - 无法读取 POST 请求正文

时间:2021-07-03 20:58:56

标签: javascript node.js request httpserver

我正在尝试在 Nodejs HTTP 服务器上创建一个简单的帐户系统。

我的服务器端代码:

var server=http.createServer(function(req,res){

  if(req.url.startsWith("/api/")){
    console.log(" - // - API CALL - // -")
    switch (req.url.substr(4)) {
      case '/createAccount':
        if(req.method=="POST"){
          const requestBody = [];
          req.on('data', (chunks)=>{
            requestBody.push(chunks);
            console.log(chunks)
          });
          req.on('end', ()=>{
            console.log(requestBody)
            const parsedData = JSON.stringify(Buffer.concat(requestBody));
            console.log(parsedData)
            res.writeHead(200,{"Content-Type":"application/json","Access-Control-Allow-Origin": "*"});
            res.end(JSON.stringify({'error':false}));
          });
        }else{
          res.writeHead(405,{"Content-Type":"application/json","Access-Control-Allow-Origin": "*"});
          res.end(JSON.stringify({'error':true,'statuscode':'405','errortext':'You need to send a POST request to /createAccount.'}));
        }
        break;
      default:
        res.writeHead(404,{"Content-Type":"application/json","Access-Control-Allow-Origin": "*"});
        res.end(JSON.stringify({'error':true,'statuscode':'404','errortext':'This is not a valid API address.'}));
    }
  }else{
    console.log(" - // - NORMAL WEB PAGE - // -")
    res.writeHead(200,{"Content-Type":"text/html","Access-Control-Allow-Origin": "*"});
    let accountstate="not logged in"
    page="<html><body>This is my homepage!<br>You are "+accountstate+".</body></html>";
    res.end(page);
  }

});
server.listen(7000);
console.log(`Listening at http://localhost:7000`);

我发送的请求:

fetch("http://localhost:7000/api/createAccount",{
    method:"POST",
    body:{
        AccountName:"test",
        Password:"THISSHOULDBEENCRYPTED"
    }
}).then(r=>r.json()).then(r=>console.log(r))

发送请求后的控制台输出:

 - // - API CALL - // -
<Buffer 5b 6f 62 6a 65 63 74 20 4f 62 6a 65 63 74 5d>
[ <Buffer 5b 6f 62 6a 65 63 74 20 4f 62 6a 65 63 74 5d> ]
{"type":"Buffer","data":[91,111,98,106,101,99,116,32,79,98,106,101,99,116,93]}

有谁知道为什么这是输出以及我如何读取普通请求正文? (预期输出:{AccountName:"test",Password:"THISSHOULDBEENCRYPTED"})

我在许多网站上寻找答案,但所有解决方案都因相同的错误而失败。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是我的固定代码:

var server=http.createServer(function(req,res){

  if(req.url.startsWith("/api/")){
    console.log(" - // - API CALL - // -")
    switch (req.url.substr(4)) {
      case '/createAccount':
        if(req.method=="POST"){
          req.setEncoding('utf8');
          const rb = [];
          req.on('data', (chunks)=>{
            rb.push(chunks);
          });
          req.on('end', ()=>{
            const body=JSON.parse(rb.join(""));
            console.log(body)
            res.writeHead(200,{"Content-Type":"application/json","Access-Control-Allow-Origin": "*"});
            res.end(JSON.stringify({'error':false,'recieved':body}));
          });
        }else{...}
        break;
      default:
        ...
    }
  }else{...}

});
server.listen(7000);
console.log(`Listening at http://localhost:7000`);

和固定请求:

fetch("http://localhost:7000/api/createAccount",{
    method:"POST",
    Headers:{'Content-Type': 'application/json'},
    body:JSON.stringify({
        AccountName:'test',
        Password:'THISSHOULDBEENCRYPTED'
    })
}).then(r=>r.json()).then(r=>console.log(r))

基本上,将编码设置为 UTF8 并将正文作为字符串发送将解决此问题。