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("\n");
    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对象

原文地址:https://www.cnblogs.com/goloving/p/9026780.html

时间: 2024-11-13 10:24:02

Node.js:get/post请求、全局对象、工具模块的相关文章

body-parser Node.js(Express) HTTP请求体解析中间件

body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日     781     声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包含请求体,Node.js 原生HTTP模块中,请求体要基于流的方式接收和解析.body-parser是一个HTTP请求体解析中间件,使用这个模块可以解析JSON.Raw.文本.URL-encoded格式的请求体,Express框架中就是使用这个模块做为请求体解析中间件. 请求体解析 1.1 原生环境

Node.js GET/POST请求

在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器一般都使用GET/POST请求. 本章节我们将为大家介绍 Node.js GET/POST请求. 获取GET请求内容 由于GET请求直接被嵌入在路径中,URL是完整的请求路径,包括了?后面的部分,因此你可以手动解析后面的内容作为GET请求的参数. node.js中url模块中的parse函数提供了这个功能. var http = require('http'); var url = require('url');

node.js搭建代理服务器请求数据

1.引入node.js中的模块 1 var http = require("http"); 2 var url = require("url"); 3 var qs = require("querystring"); 2.创建服务器 //用node中的http创建服务器 并传入两个形参 http.createServer(function(req , res) { //设置请求头 允许所有域名访问 解决跨域 res.setHeader("

Node中的全局变量和全局对象

全局对象和全局变量 概念:所有属性都可以在程序的任何地方访问,即全局变量.在JavaScript中,通常window是全局对象,而Node.js的全局对象是global,所有全局变量都是global对象的属性,如:console.process等. global最根本的作用是作为全局变量的宿主,满足一下条件称为全局变量 1. 在最外层定义的变量 2. 全局对象的属性 3. 隐式定义的变量 ▲ 在node中不可能在最外层定义变量,因为所有的用户代码都是属于当前模块的,而模块本身是不属于最外层上下文

安装js包管理工具(node.js、yarm)及代码编辑工具(vs code)

学习vue等前端开发需要安装node.js.它是js包的管理工具,个人理解相当于java的maven. 在开发之前需要安装node.js和yarm.关于什么npm和yarn之间的区别,请网上找资料.有了管理包的管理工具,还需要安装代码编辑工具,我的是vs code. yarn安装 + 先下载node.js安装,https://nodejs.org/en/ + 安装node.js后,使用npm安装yarm. npm install -g yarn + 查看版本:yarn --version.能查看

关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施

背景说明 最近在工作项目中有下面一个场景: 使用Node.js的express框架实现了一个文件系统服务器端,其中有个API用于客户端上传文件.客户端使用Node.js的HttpClient来调用服务器端的API上传文件. 客户端在上传小文件时没有任何问题,在上传大文件时httpClient请求报错了下面的错误, { [Error: socket hang up] code: 'ECONNRESET' } google了很多资料,最后看了一下Node.js的相关源码终于知道了该问题的原因和解决办

Node.js继承中的静态类对象(《node.js开发实战详解》书中一些错误的改正)

今天气真好,最近挂掉一些面试之后心情略失落. 神马都是浮云,要永远做好世界第二. 不多提了,你问我心态为啥变好了.-------都是情怀,,. 嗯啊,最近在研究node. 别人问?你这水平还node... 哈哈哈,好伤心.... 不多提了,言归正传. 神马模块化神马的先就不多讲了,就一个module.export和export区别,后者对象的属性属于前者,逆命题不成立. 还有util.inherits(A,B)这个API注意一下A只会继承B的原型方法,原型以外的不会继承.不是说原型中数据是共享的

Node.js处理I/O数据之Buffer模块缓冲数据

一.前传 在之前做web时也经常用到js对象转json和json转js对象.既然是Node.js处理I/O数据,也把这个记下来. Json转Js对象:JSON.parse(jsonstr); //可以将json字符串转换成json对象 Js对象转Json:JSON.stringify(jsonobj); //可以将json对象转换成json对符串 var jsonStr='{"name":"cuiyanwei","sex":"男&quo

Node.js 入门教程 (二):模块

由于新工作要做前端,作为前端小白而且能尽快学习,所以选择慕课网的node.js的入门教程.博客只做自己学习的记录. JavaScript缺少模块管理机制,容易出现变量被覆盖,方法被替代的情况(既被污染).特别是存在依赖关系时,容易出现错误.采用命名空间的方式,把变量和函数限制在某个特定的作用域内,人肉约定一套命名规范来限制代码,保证代码安全运行. CommonJs是一套规范,包括了modules,system,encodings,unit test等等来约定JavaScript应该怎么去组织和编

Node.js 实现第一个应用以及HTTP模块和URL模块应用

/* 实现一个应用,同时还实现了整个 HTTP 服务器. * */ //1.引入http模块 var http=require('http'); //2.用http模块创建服务 /* req获取url信息 (request) res 浏览器返回响应信息 (response) * */ http.createServer(function(req,res){ // 发送 HTTP 头部 // HTTP 状态值: 200 : OK //设置 HTTP 头部,状态码是 200,文件类型是 html,字