一个关于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的数据呢!


10 回复

根据你提供的代码片段,存在一些问题需要修正,以便正确处理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/');
});

关键点解释

  1. 路由处理

    • 使用 req.methodreq.url 来区分不同的请求类型和路径。
    • 对于GET请求,返回一个包含表单的HTML页面。
    • 对于POST请求,处理表单提交的数据。
  2. 表单数据处理

    • firstPage 函数中,返回一个简单的HTML表单,用户可以输入JSON数据并提交。
    • 当用户提交表单时,触发 login 函数处理POST请求。
  3. POST数据处理

    • 使用 req.on('data', ...) 来累积POST请求体的数据。
    • 使用 req.on('end', ...) 在数据接收完毕后,将累积的数据转换为字符串,并使用 JSON.parse 解析为JavaScript对象。
    • 打印解析后的数据,并返回给客户端。
  4. 错误处理

    • 确保在解析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的时候出的问题是吧

代码差不多没问题,还是有些地方跑不了,所以替你改了些。

已经解决了。果然是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请求时,你应该能够看到正确的日志输出。

回到顶部