关于Nodejs中post的发送,和post处理的小白问题。

关于Nodejs中post的发送,和post处理的小白问题。

1.我不知道我代码哪里写错了,只要不注释掉res.writeHead()就会有错。 2.弱弱地问一句,我怎么把一个对象的某个属性返回去呀? 比如我写一个res.wirite(data.a)就说要转成字符串,但是用querystring.stringify却没有结果,然后试了一下JS里的toString(),却说没定义。 //服务器 var http = require(‘http’); var url = require(‘url’); var util = require(‘util’); var qs = require(‘querystring’); http.createServer(function(req,res){ var data = ‘’; req.on(‘data’,function(chunk){ data+=chunk; });

 req.on('end',function(){
	 data = qs.parse(data);
 });
   res.writeHead(200, {
    'Content-Length': data.length,
    'Content-Type': 'text/plain' });
 res.write('hello');
 //res.write(data.a);
 res.end("hello");

}).listen(3000);

console.log("!!!");

//模拟一个POST请求 var http=require(‘http’); var qs=require(‘querystring’);

var post_data={a:123,time:new Date().getTime()}; var content=qs.stringify(post_data);

var options = { host: ‘localhost’, port: 3000, path: ‘/’, method: ‘POST’, headers:{ ‘Content-Type’:‘application/x-www-form-urlencoded’, ‘Content-Length’:content.length } }; console.log(“post options:\n”,options); console.log(“content:”,content); console.log("\n");

var req = http.request(options, function(res) { console.log("statusCode: ", res.statusCode); console.log(“headers: “, res.headers); var _data=’’; res.on(‘data’, function(chunk){ _data += chunk; }); res.on(‘end’, function(){ console.log(”\n—>>\nresult:”,_data) }); });

req.write(content); req.end();


17 回复

好的,让我们来分析并解决你的问题。主要问题包括 res.writeHead() 的使用、如何将对象属性返回给客户端以及如何正确处理 POST 请求。

1. 关于 res.writeHead() 的问题

res.writeHead() 是用来设置 HTTP 响应头的。如果你没有设置正确的响应头,可能会导致错误。在这个例子中,你不需要设置 Content-Length,因为 res.writeres.end 会自动处理这部分。

2. 如何将对象属性返回给客户端

你可以通过 JSON.stringify 将对象转换为 JSON 字符串,然后再通过 res.write 返回。

示例代码

服务器端代码

var http = require('http');
var url = require('url');
var util = require('util');
var qs = require('querystring');

http.createServer(function (req, res) {
    var data = '';

    req.on('data', function (chunk) {
        data += chunk;
    });

    req.on('end', function () {
        data = qs.parse(data);

        // 解析数据后,将对象的一个属性返回给客户端
        var responseObj = {
            a: data.a,
            time: new Date().toISOString()
        };

        // 将对象转换为 JSON 字符串
        var jsonString = JSON.stringify(responseObj);

        // 设置响应头
        res.writeHead(200, {
            'Content-Type': 'application/json'
        });

        // 写入 JSON 字符串
        res.write(jsonString);

        // 结束响应
        res.end();
    });
}).listen(3000);

console.log("Server running at http://localhost:3000/");

客户端代码(模拟 POST 请求)

var http = require('http');
var qs = require('querystring');

var post_data = { a: 123, time: new Date().getTime() };
var content = qs.stringify(post_data);

var options = {
    host: 'localhost',
    port: 3000,
    path: '/',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(content)
    }
};

console.log("Post options:\n", options);
console.log("Content:", content);
console.log("\n");

var req = http.request(options, function (res) {
    console.log("Status Code: ", res.statusCode);
    console.log("Headers: ", res.headers);

    var responseData = '';
    res.on('data', function (chunk) {
        responseData += chunk;
    });

    res.on('end', function () {
        console.log("\n>>>\nResult:", responseData);
    });
});

req.write(content);
req.end();

解释

  1. 服务器端

    • 接收 POST 请求的数据,并将其解析为对象。
    • 创建一个包含所需属性的对象,并将其转换为 JSON 字符串。
    • 设置响应头,指定 Content-Typeapplication/json
    • 使用 res.write 发送 JSON 字符串,并使用 res.end 结束响应。
  2. 客户端

    • 创建一个 POST 请求对象,并设置请求头。
    • 将数据字符串化,并发送 POST 请求。
    • 处理服务器响应,打印出结果。

这样,你就可以正确地发送和处理 POST 请求了。


你好,我也刚学,测试了下你的代码。 应该是用 var https=require(‘https’);就可以了。 代码就运行正常了。

var https=require(‘https’);运行

谢谢,为什么呀?

谢谢,为什么呀?

问题所在:

req.on('end',function(){
    data = qs.parse(data);
});
  res.writeHead(200, {
     'Content-Length': data.length,

提示: 异步

果然! 原来data还没接受完我就写头了。 原来我还是没有真正理解什么叫异步呀。

用 Markdown 语法标记一下代码 :)

var http = require('http')

var http=require(‘http’); var qs=require(‘querystring’); var post_data={a:123,time:new Date().getTime()};//这是需要提交的数据 var content=qs.stringify(post_data);

var options = { host: ‘localhost’, port: 3000, path: ‘/’, method: ‘POST’, headers:{ ‘Content-Type’:‘application/x-www-form-urlencoded’, ‘Content-Length’:content.length } }; console.log(“post options:\n”,options); console.log(“content:”,content); console.log("\n");

var req = http.request(options, function(res) { console.log("statusCode: ", res.statusCode); console.log(“headers: “, res.headers); var _data=’’; res.on(‘data’, function(chunk){ _data += chunk; console.log(_data); }); res.on(‘end’, function(){ //data = qs.parse(_data); console.log(‘end is emitted’); console.log(”\n—>>\nresult:”,_data) }); });

req.write(content); req.end();

//服务器 var http = require(‘http’); var url = require(‘url’); var util = require(‘util’); var qs = require(‘querystring’); http.createServer(function(req,res){ var data = ‘’; req.on(‘data’,function(chunk){ data+=chunk; });

req.on(‘end’,function(){ res.writeHead(200, { ‘Content-Length’: data.length, ‘Content-Type’: ‘text/plain’ }); data = qs.parse(data); console.log(data.a.toString()); res.write(data.a.toString()); res.end(‘hello’); //data = qs.parse(data); console.log(data); }); }).listen(3000); console.log("!!!");

在客户端 我的res.on(end)事件始终没有反应……这是为什么?

怎样标记呀? 我在前面加了很多空格也不行…………

<pre><code>这是一个代码区块。 </code></pre>

<pre><code>这样 怎么跟你们的不一样

‘’‘ 这是代码 ’’’

  这是代码

就像这样么?

好好玩呀~

针对你的问题,我将从两个方面进行解答:一是如何正确处理POST请求并返回特定属性的数据,二是如何确保服务器端正确接收POST数据。

1. 服务器端处理POST请求

首先,服务器端需要正确解析POST数据,并在响应中返回所需属性。以下是修改后的服务器代码:

const http = require('http');
const qs = require('querystring');

http.createServer((req, res) => {
    if (req.method === 'POST') {
        let data = '';

        req.on('data', chunk => {
            data += chunk;
        });

        req.on('end', () => {
            const parsedData = qs.parse(data);

            // 返回特定属性的数据
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write(JSON.stringify({ result: parsedData.a }));
            res.end();
        });
    } else {
        res.writeHead(405, {'Content-Type': 'text/plain'});
        res.end('Only POST method is supported.');
    }
}).listen(3000, () => console.log('Server listening on port 3000'));

2. 客户端发送POST请求

客户端发送POST请求时,需要正确设置内容类型和内容长度。下面是正确的发送POST请求的示例:

const http = require('http');
const qs = require('querystring');

const postData = { a: 123, time: new Date().getTime() };
const content = qs.stringify(postData);

const options = {
    host: 'localhost',
    port: 3000,
    path: '/',
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(content)
    }
};

console.log('Post options:', options);
console.log('Content:', content);
console.log('\n');

const req = http.request(options, res => {
    console.log('statusCode:', res.statusCode);
    console.log('headers:', res.headers);

    let responseData = '';
    res.on('data', chunk => {
        responseData += chunk;
    });

    res.on('end', () => {
        console.log('\n-->\nResult:', responseData);
    });
});

req.write(content);
req.end();

关键点解释

  • 服务器端:监听POST请求,并使用qs.parse()解析请求体,之后返回特定属性(如a)。
  • 客户端:正确设置POST请求的Content-TypeContent-Length头,以确保服务器能够正确解析请求体。
  • 错误处理:在服务器端增加了一个简单的方法判断逻辑,以确保只接受POST请求。

以上代码应该可以解决你的问题,如果还有其他疑问,欢迎继续提问!

回到顶部