我正在尝试在 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"})
我在许多网站上寻找答案,但所有解决方案都因相同的错误而失败。
提前致谢!
答案 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 并将正文作为字符串发送将解决此问题。