一个关于post的Nodejs问题~
一个关于post的Nodejs问题~
var http = require(‘http’);
var server = http.createServer();
var querystring = require(‘querystring’);
var count=0;
var firstPage = function(res){
res.writeHead(200, {‘Content-Type’: ‘text/html’});
var html = “?json={‘interfaceid’:‘0x1002’,‘mac’:‘cat’,‘gameid’:‘23’,‘uid’:‘3000’}”;
res.end(html);
}
var login = function(req, res) { var info =’’;
req.addListener('data', function(res.){
console.log('\n chunk:'+chunk);
info += chunk;
})
.addListener('end', function(){
info = querystring.parse(info);
console.log('\n System:'+info.interfaceid);
})
}
var requestFunction = function (req, res){
if(count==0){
firstPage(res);
}else{
login(req, res)
}
count++;
}
server.on(‘request’,requestFunction);
server.listen(1337, “127.0.0.1”);
console.log(‘Server running at http://127.0.0.1:1337/’);
以上部分代码,用post发送了内容为var html = “?json={‘interfaceid’:‘0x1002’,‘mac’:‘cat’,‘gameid’:‘23’,‘uid’:‘3000’}”;的json的数据,可是却不进 req.addListener的方法。导致info 为空~难道不能这么用~如果不能的话,哪怎么用POST解析json的数据呢!
根据你提供的代码片段,存在一些问题需要修正,以便正确处理POST请求中的JSON数据。以下是修正后的代码示例,以及对关键部分的解释。
修正后的代码
var http = require('http');
var url = require('url');
var server = http.createServer((req, res) => {
if (req.method === 'GET' && req.url === '/') {
firstPage(res);
} else if (req.method === 'POST' && req.url === '/login') {
login(req, res);
}
});
function firstPage(res) {
res.writeHead(200, {'Content-Type': 'text/html'});
var html = "<html><body><form action='/login' method='post'><input type='text' name='json' value='{\"interfaceid\":\"0x1002\",\"mac\":\"cat\",\"gameid\":\"23\",\"uid\":\"3000\"}'><button type='submit'>Submit</button></form></body></html>";
res.end(html);
}
function login(req, res) {
let body = [];
req.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
const parsedBody = JSON.parse(body);
console.log(parsedBody);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(`Received data: ${JSON.stringify(parsedBody)}`);
});
}
server.listen(1337, "127.0.0.1", () => {
console.log('Server running at http://127.0.0.1:1337/');
});
关键点解释
-
路由处理:
- 使用
req.method
和req.url
来区分不同的请求类型和路径。 - 对于GET请求,返回一个包含表单的HTML页面。
- 对于POST请求,处理表单提交的数据。
- 使用
-
表单数据处理:
- 在
firstPage
函数中,返回一个简单的HTML表单,用户可以输入JSON数据并提交。 - 当用户提交表单时,触发
login
函数处理POST请求。
- 在
-
POST数据处理:
- 使用
req.on('data', ...)
来累积POST请求体的数据。 - 使用
req.on('end', ...)
在数据接收完毕后,将累积的数据转换为字符串,并使用JSON.parse
解析为JavaScript对象。 - 打印解析后的数据,并返回给客户端。
- 使用
-
错误处理:
- 确保在解析JSON之前,检查数据是否完整且格式正确,以避免运行时错误。
通过这种方式,你可以正确地处理POST请求中的JSON数据。
1、帖的代码格式太乱了,很难看。学一下Markdown语法; 2、“可是却不进 req.addListener的方法。”这句话是神马意思?
就是说如果我req.addListener里面的代码不在执行感觉没被调用
看起来是post的问题, 稍微改动下,然后用命令行跑,第二次就会看到listener working:
curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"interfaceid":'1002',"mac": "cat","gameid":"23","uid":"3000"}' http://localhost:1337
码:
var http = require('http');
var server = http.createServer();
var querystring = require('querystring');
var count = 0;
var firstPage = function(res) {
res.writeHead(200, {
'Content-Type': 'text/html'
});
var html = "?json={'interfaceid':'0x1002','mac':'cat','gameid':'23','uid':'3000'}";
res.end(html);
}
var login = function(req, res) {
var info = '';
req.addListener('data', function(chunk) {
console.log('\n chunk:' + chunk);
info += chunk;
}).addListener('end', function() {
info = JSON.parse(info)
console.log('\n System:' + info.interfaceid);
res.end()
})
}
var requestFunction = function(req, res) {
if(count == 0) {
firstPage(res);
} else {
login(req, res)
}
count++;
}
server.on(‘request’, requestFunction);
server.listen(1337, “127.0.0.1”);
没太懂~
curl 是个command line的指令,用它来post个json到你的server,开个terminal即可。如果你的系统没有curl, 也可用别的方法post, 目的就是试试看 进不进你的 req.addListener, 那是你问的吧?
代码差不多没问题,还是有些地方跑不了,所以替你改了些。
已经解决了。果然是post上出的问题。 感谢venngomez
你当前的代码存在一些问题,特别是在处理POST请求时,req
对象上的事件监听器没有正确地设置。另外,你试图解析的字符串看起来像是URL编码的查询字符串,而不是JSON数据。以下是如何改进你的代码以正确处理POST请求,并解析请求体中的JSON数据。
示例代码
const http = require('http');
const querystring = require('querystring');
let count = 0;
const firstPage = (res) => {
res.writeHead(200, {'Content-Type': 'text/html'});
const html = "<html><body><form method='POST'><input type='hidden' name='json' value='{\"interfaceid\":\"0x1002\",\"mac\":\"cat\",\"gameid\":\"23\",\"uid\":\"3000\"}'><input type='submit'></form></body></html>";
res.end(html);
};
const login = (req, res) => {
let body = [];
req.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
const info = JSON.parse(querystring.parse(body).json);
console.log('\n System:', info);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Data received');
});
};
const requestFunction = (req, res) => {
if (count === 0) {
firstPage(res);
} else {
login(req, res);
}
count++;
};
const server = http.createServer(requestFunction);
server.listen(1337, "127.0.0.1", () => {
console.log('Server running at http://127.0.0.1:1337/');
});
解释
- HTML表单:我将HTML页面改为一个表单,以便你可以通过提交表单来触发POST请求。
- 数据处理:在
login
函数中,我们使用req.on('data', ...)
来收集所有来自客户端的数据片段,并在req.on('end', ...)
中将这些片段组合起来,然后进行解析。 - JSON解析:由于你希望处理的是JSON格式的数据,所以在解析之前,首先需要将查询字符串转换成对象,然后再解析JSON。
这样修改后,当你向服务器发送POST请求时,你应该能够看到正确的日志输出。