Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用request.on()和querystring.parse()实现POST方法的js/nodejs初级服务器_Javascript_Node.js_Post - Fatal编程技术网

Javascript 使用request.on()和querystring.parse()实现POST方法的js/nodejs初级服务器

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 =

在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 = '';

        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如果主体解析器不能满足您的即时需求,请查看

  • github.com/stream-utils/raw-body
  • github.com/moscarton/express-rawbody

  • 关于你的第一个问题:

    它使用第二个参数作为回调函数,再次使用第一个参数“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"
    }