js / nodejs基本的初学者服务器,用于使用request.on()和querystring.parse()方法的POST方法

我开始学习一些nodejs在我的web类后的JavaScript来做一些简单的服务器,下面的例子:

var http = require('http'); var url = require('url'); var querystring = require('querystring'); function onRequest(request, response) { if (request.method == 'POST') { var body = ''; request.on('data', function (data) { body += data; // data sent via http protocol will always be sent as a string and can be concatenated // if body > 1e6 === 1* Math.pow(10,6) ~~~ 1MB // flood attack or faulty client // (code 413: request entity too large), kill request if (body.length > 1e6) { response.writeHead(413, {'Content-Type':'text/plain'}).end(); request.connection.destroy(); } }); // end of data communication: body will contain all the parameters of the query request.on('end',function(){ var POST = querystring.parse(body); // now to get the different parameters use // POST.<field name> eg POST.user response.end('Hello, ' + POST.firstname + ' ' + POST.lastname); }); } } var server = http.createServer(onRequest); server.listen(3000); 

我已经明白了这一点,但是在查找和理解此代码的request.on()和querystring.parse()部分时遇到了困难。 为了更清楚地说明,我将在下面详细介绍与之混淆的部分。

1)request.on()

所以我读了request.on('data')会让nodejs为接收大块数据的事件设置一个监听器。 因此,以上面这个部分的例子:

 request.on('data', function (data) { body += data; if (body.length > 1e6) { response.writeHead(413, {'Content-Type':'text/plain'}).end(); request.connection.destroy(); } 

它将第二个参数作为一个callback函数,再次获取第一个参数“data”。 这是我感到困惑,这是什么试图在这里做第二个参数?

2)request.on('end')和querystring.parse()

我读了request.on('end')会让nodejs为数据上传完成的信号设置一个监听器,所以下面这段代码:

 request.on('end',function(){ var POST = querystring.parse(body); // now to get the different parameters use // POST.<field name> eg POST.user response.end('Hello, ' + POST.firstname + ' ' + POST.lastname); } 

在request.on('end')中,我们创build了一个名为POST的新variables,并将其设置为等于querystring.parse(body)其中body是所有组合的前一个variables。 它是如何从这个querystring.parse(body)并在其上应用.firstnamePOST.firstname )并访问它的组件?

提前致谢。

对于你的第一个问题:

它将第二个参数作为一个callback函数,再次获取第一个参数“data”。 这是我感到困惑,这是什么试图在这里做第二个参数?

所以你在这里做的是定义一个监听器函数,在每次request触发一个data事件时被调用。 您可以通过以下方式看清楚:

 request.on('data', onChunkReceived) function onChunkReceived (data) { body += data if body > 1e6 === 1* Math.pow(10,6) ~~~ 1MB if (body.length > 1e6) { response.writeHead(413, {'Content-Type':'text/plain'}).end(); request.connection.destroy(); } } 

你正在做的是定义一个函数,它需要一个data参数; 不要因为select的事件名称和参数名称相同而太挂断; 没有任何理由你不能说出任何你想要的名字:

 request.on('data', onChunkReceived) function onChunkReceived (chunk) { body += chunk if body > 1e6 === 1* Math.pow(10,6) ~~~ 1MB if (body.length > 1e6) { response.writeHead(413, {'Content-Type':'text/plain'}).end(); request.connection.destroy(); } } 

…将采取完全相同的方式。 所以再说一遍: data是事件的名称,而且你正在定义一个函数来接收服务器接收到的每一块数据。 在你上面的例子中,函数只是匿名函数,因为我重新格式化了上面的代码片段,它是一个单独的命名函数。

现在回答第二个问题:

在request.on('end')中,我们创build了一个名为POST的新variables,并将其设置为等于querystring.parse(body),其中body是所有组合的前一个variables。 它是如何从这个querystring.parse(body)并在其上应用.firstname(POST.firstname)并访问它的组件?

querystring.parse方法采用特定格式的string,并将其parsing为一个Javascript对象。 querystring上的Node.js文档解释得比我能在这里好得多。 所以,我只能假设你正在工作的例子期望身体将采用特定的格式,即表单编码,意思是它的格式如下:

firstname=Dan&lastname=Takahashi

当你在那个string上调用querystring.parse ,你会返回一个对象,如下所示:

 POST = { "firstname": "Dan", "lastname": "Takahashi" } 

然后你可以按照上面的说法来处理: POST.firstname ,它是“Dan”, POST.lastname是“Takahashi”。

问题1和2处理http请求数据stream,并允许您注入代码来执行自定义活动,例如将stream保存到缓冲区/ var以供以后使用。

如果你想查询POST参数,你可以简单地使用bodyparser节点模块https://github.com/expressjs/body-parser

使用对象点符号查询参数。 例如req.body.form_field_name

body-parser是一个很好的模块,用于快速访问通过POST / PUT方法传递的数据。

Express保持隐藏的原始数据,您需要使用与body-parser类似的模块来访问。 请注意,这是正文内容的只读副本。

干杯。

PS如果身体分析器没有解决您的迫切需求,请检查

  1. github.com/stream-utils/raw-body
  2. github.com/moscartong/express-rawbody