Javascript 使用request.on()和querystring.parse()实现POST方法的js/nodejs初级服务器
在javascript之后,我开始在我的web类中学习一些NodeJ,以制作一些简单的服务器,下面是一个示例:Javascript 使用request.on()和querystring.parse()实现POST方法的js/nodejs初级服务器,javascript,node.js,post,Javascript,Node.js,Post,在javascript之后,我开始在我的web类中学习一些NodeJ,以制作一些简单的服务器,下面是一个示例: var http = require('http'); var url = require('url'); var querystring = require('querystring'); function onRequest(request, response) { if (request.method == 'POST') { var body =
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> e.g. POST.user
response.end('Hello, ' + POST.firstname + ' ' + POST.lastname);
});
}
}
var server = http.createServer(onRequest);
server.listen(3000);
它使用第二个参数作为回调函数,再次使用第一个参数“data”。这就是我所困惑的,第二个参数的作用是什么
2) request.on('end')和querystring.parse()
我阅读了该请求。on('end')将让nodejs为数据上传完成的信号设置一个侦听器,因此以下代码:
request.on('end',function(){
var POST = querystring.parse(body);
// now to get the different parameters use // POST.<field name> e.g. POST.user
response.end('Hello, ' + POST.firstname + ' ' + POST.lastname);
}
request.on('end',function(){
var POST=querystring.parse(body);
//现在使用//POST.e.POST.user获取不同的参数
response.end('Hello,'+POST.firstname+''+POST.lastname);
}
内部请求。在('end')上,我们创建了一个名为POST的新变量,并将其设置为querystring.parse(body)
,其中body
是所有组合数据的前一个变量。它是如何从querystring.parse(body)
开始的,并对其应用.firstname
(POST.firstname
)访问它的那个部分
提前感谢。问题1和问题2处理http请求数据流,并允许您插入代码以执行自定义活动,如将流保存到缓冲区/var以供以后使用 如果要查询POST参数,只需使用bodyparser节点模块即可 使用对象点表示法查询参数。例如req.body.form\u field\u name body parser是一个很好的模块,用于快速访问POST/PUT方法中传递的数据 Express会隐藏原始正文数据,您需要使用类似正文解析器的模块才能访问。请注意,这是正文内容的只读副本 干杯 PS如果主体解析器不能满足您的即时需求,请查看
关于你的第一个问题: 它使用第二个参数作为回调函数,再次使用第一个参数“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();
}
}
您要做的是定义一个函数,它接受一个数据
参数;不要因为选择的事件名称和参数名称是相同的而太过纠结;没有理由不能根据需要命名它:
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')中,我们创建了一个名为POST的新变量,并将其设置为等于querystring.parse(body),body是所有数据组合的前一个变量。它是如何从querystring.parse(body)开始的,并在其上应用.firstname(POST.firstname)并访问其组件的
querystring.parse
方法获取特定格式的字符串,并将其解析为Javascript对象。这里的解释要比我能解释的好得多。因此,我只能假设您正在使用的示例期望主体采用特定格式,也就是说,它采用以下格式:
firstname=Dan&lastname=Takahashi
在该字符串上调用querystring.parse
时,将返回一个如下所示的对象:
POST = {
"firstname": "Dan",
"lastname": "Takahashi"
}
然后,您可以按照上面所说的地址:
POST.firstname
将是“Dan”和POST.lastname
,将是“Takahashi”。仍然没有人知道这些问题的答案吗?感谢您的清晰和简洁的解释。第二部分是querystring.parse(正文)
意味着它在变量主体上使用此方法,该变量是所有接收到的数据的总和吗?那么这是否意味着接收到的数据必须采用您提到的格式:firstname=Dan&lastname=Takahashi
否则POST.firstname
将无法从中获取第一个名称示例?为什么接收到的数据总是以这种形式出现,这样我们就可以调用querystring.parse().firstname?@darkphoton是的,接收到的数据必须是这种格式,示例才能正常工作。这意味着,无论客户端发布什么数据,都需要以这种格式发送(称为application/x-www-form-urlencoded
)。这称为“mimetype”。当客户端通过HTTP发送数据时,它会设置一个“content-type”头,上面写着“这是我发送数据的格式”。在实际情况中,您将阅读该标题,决定是否可以处理它指定的类型,并相应地处理它。在您发布的这个简单示例中,它是采用一种格式构建的。
POST = {
"firstname": "Dan",
"lastname": "Takahashi"
}