Node 基础知识点总结

2017年07月12日

数据库模块

 1var mysql = require('mysql');
 2
 3// 创建数据库连接
 4var connection = mysql.createConnection({
 5  host: 'localhost',
 6  user: 'root',
 7  password: '0000',
 8  database: 'phone_weixin',
 9});
10
11connection.connect();
12
13// 操作数据库返回数据
14connection.query('select * from msg', function (error, results, fields) {
15  if (error) throw error;
16  console.log(results);
17});
18
19connection.end();

fs 模块

 1readFile();
 2readFileSync();
 3// 读取文件
 4var text = fs.readFileSync('fileNmae.txt', 'utf8');
 5
 6writeFile();
 7writeFileSync();
 8
 9// 以添加模式写入字符
10fs.writeFileSync('fileName', 'content', { flag: 'a' });

HTTP

客户端请求时

当出现ENOTFOUND 错误时,可以的解决办法是设置:

1http.globalAgent.maxSockets = 10;

下面这段话可能有所解释:

默认情况下, Node.js 会使用 HTTP Agent 这个类来创建 HTTP 连接,这个类实现了 socket 连接池,每个主机+端口对的连接数默认上限是 5。同时HTTP Agent 类发起的请求中默认带上了 Connection: Keep-Alive,导致已返回的连接没有及时释放,后面发起的请求只能排队。

解决办法有三种:

  • 禁用 HTTP Agent,即在在调用 get 方法时额外添加参数 agent: false
  • 设置 http 对象的全局 socket 数量上限
  • 在请求返回的时候及时主动断开连接

来源:http://blog.csdn.net/bolg_hero/article/details/49427677

Child Process 模块

exec 方法用于执行 bash 命令,它的参数是一个命令字符串。

1var exec = require('chile_process').exec;
2
3var ls = exec('ls -l', function (error, stdout, stderr) {
4  if (error) {
5    console.log(error);
6  }
7  console.log(stdout);
8});

由于标准输出和标准错误都是流对象(stream),可以监听 data 事件,因此上面的代码也可以写成下面这样。

 1var exec = require('child_process').exec;
 2var child = exec('ls -l');
 3
 4child.stdout.on('data', function (data) {
 5  console.log('stdout: ' + data);
 6});
 7child.stderr.on('data', function (data) {
 8  console.log('stderr: ' + data);
 9});
10child.on('close', function (code) {
11  console.log('closing code: ' + code);
12});

异步编程

如果数组成员可以并行处理,但后续代码仍然需要所有数组成员处理完毕后才能执行的话,则异步代码会调整成以下形式:

 1(function (i, len, count, callback) {
 2  for (; i < len; ++i) {
 3    (function (i) {
 4      async(arr[i], function (value) {
 5        arr[i] = value;
 6        if (++count === len) {
 7          callback();
 8        }
 9      });
10    })(i);
11  }
12})(0, arr.length, 0, function () {
13  // All array items have processed.
14});

以上代码并行处理所有数组成员,并通过计数器变量来判断什么时候所有数组成员都处理完毕了。

HTTP 协议

请求报文

规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:

<method> <request-URL> <version>
<headers>

<entity-body>

响应报文

HTTP 响应与 HTTP 请求相似,HTTP 响应也由 3 个部分构成,分别是:

状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

URL

HTTP URL (URL 是一种特殊类型的 URI,包含了用于查找某个资源的足够的信息)的格式如下:

http://host[":"port][abs_path]

如果 URL 中没有给出 abs_path,那么当它作为请求 URI 时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。

在浏览器中输入 URL 后的流程

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的 HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器
  5. 释放 TCP 连接
  6. 浏览器得到 html 文本并显示内容

参考

7 天学会 Node.js:http://nqdeng.github.io/7-days-nodejs/