zoukankan      html  css  js  c++  java
  • Node.js:get/post请求、全局对象、工具模块

    一、GET/POST请求

      在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交。表单提交到服务器一般都使用 GET/POST 请求。

    1、获取GET请求内容

      由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数。node.js 中 url 模块中的 parse 函数提供了这个功能。

    var http = require('http');
    var url = require('url');
    var util = require('util');
     
    http.createServer(function(req, res){
        res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
        res.end(util.inspect(url.parse(req.url, true)));
    }).listen(3000);

      我们可以使用 url.parse 方法来解析 URL 中的参数

    var http = require('http');
    var url = require('url');
    var util = require('util');
     
    http.createServer(function(req, res){
        res.writeHead(200, {'Content-Type': 'text/plain'});
     
        // 解析 url 参数
        var params = url.parse(req.url, true).query;
        res.write("网站名:" + params.name);
        res.write("
    ");
        res.write("网站 URL:" + params.url);
        res.end();
     
    }).listen(3000);

    2、获取 POST 请求内容

      POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。

      基本语法结构说明:

    var http = require('http');
    var querystring = require('querystring');
     
    http.createServer(function(req, res){
        // 定义了一个post变量,用于暂存请求体的信息
        var post = '';     
     
        // 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
        req.on('data', function(chunk){    
            post += chunk;
        });
     
        // 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
        req.on('end', function(){    
            post = querystring.parse(post);
            res.end(util.inspect(post));
        });
    }).listen(3000);

      以下实例表单通过 POST 提交并输出数据

    var http = require('http');
    var querystring = require('querystring');
     
    var postHTML = 
      '<html><head><meta charset="utf-8"><title>Node.js 实例</title></head>' +
      '<body>' +
      '<form method="post">' +
      '网站名: <input name="name"><br>' +
      '网站 URL: <input name="url"><br>' +
      '<input type="submit">' +
      '</form>' +
      '</body></html>';
     
    http.createServer(function (req, res) {
      var body = "";
      req.on('data', function (chunk) {
        body += chunk;
      });
      req.on('end', function () {
        // 解析参数
        body = querystring.parse(body);
        // 设置响应头部信息及编码
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
     
        if(body.name && body.url) { // 输出提交的数据
            res.write("网站名:" + body.name);
            res.write("<br>");
            res.write("网站 URL:" + body.url);
        } else {  // 输出表单
            res.write(postHTML);
        }
        res.end();
      });
    }).listen(3000);

    二、全局对象

      JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。

      在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。

      全局对象与全局变量:

      global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条件的变量是全局变量:

    • 在最外层定义的变量;
    • 全局对象的属性;
    • 隐式定义的变量(未定义直接赋值的变量)。

      当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。需要注意的是,在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的, 而模块本身不是最外层上下文。

      注意: 永远使用 var 定义变量以避免引入全局变量,因为全局变量会污染 命名空间,提高代码的耦合风险。

    1、__filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。

    // 输出全局变量 __filename 的值
    console.log( __filename );
    
    //执行 main.js 文件,代码如下所示:
    $ node main.js
    /web/com/nodejs/main.js

    2、__dirname 表示当前执行脚本所在的目录。即上例的话,知道nodejs目录

    3、setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数。返回一个代表定时器的句柄值。

    clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。

    4、setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。

    setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。

    5、console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具,后来逐渐成为浏览器的实施标准。Node.js 沿用了这个标准,提供与习惯行为一致的 console 对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。

    console.time(label):输出时间,表示计时开始。

    console.timeEnd(label):结束时间,表示计时结束。

    console.trace(message[, ...]):当前执行的代码在堆栈中的调用路径,这个测试函数运行很有帮助,只要给想测试的函数里面加入 console.trace 就行了。调试作用

    6、process 是一个全局变量,即 global 对象的属性。

      它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。通常在你写本地命令行程序的时候,少不了要 和它打交道。

    三、工具模块

      在 Node.js 模块库中有很多好用的模块。

    OS 模块提供基本的系统操作函数。提供了一些基本的系统操作函数。我们可以通过以下方式引入该模块:var os = require("os")

    Path 模块提供了处理和转换文件路径的工具。path 模块提供了一些用于处理文件路径的小工具

    Net 模块用于底层的网络通信。提供了服务端和客户端的的操作。提供了一些用于底层的网络通信的小工具,包含了创建服务器/客户端的方法

    DNS 模块用于解析域名。

    Domain 模块简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常。

      domain模块,把处理多个不同的IO的操作作为一个组。注册事件和回调到domain,当发生一个错误事件或抛出一个错误时,domain对象会被通知,不会丢失上下文环境,也不导致程序错误立即退出,与process.on('uncaughtException')不同。

    Domain 模块可分为隐式绑定和显式绑定:

    • 隐式绑定: 把在domain上下文中定义的变量,自动绑定到domain对象
    • 显式绑定: 把不是在domain上下文中定义的变量,以代码的方式绑定到domain对象
  • 相关阅读:
    C#Note13:如何在C#中调用python
    C# Note12:WPF只允许数字的限制性TextBox
    C# Note11:如何优雅地退出WPF应用程序
    C#读书笔记:线程,任务和同步
    Programming好文解读系列(—)——代码整洁之道
    java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载
    java面试题:如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
    java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序
    java算法面试题:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个, 如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉的半个”。
    Java算法面试题:编写一个程序,将e: eck目录下的所有.java文件复制到e:jpg目录下,并将原来文件的扩展名从.java改为.jpg
  • 原文地址:https://www.cnblogs.com/goloving/p/9026780.html
Copyright © 2011-2022 走看看