Node.js

Posted 飛@茑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js相关的知识,希望对你有一定的参考价值。

Node.js

Node.js 是一个基于 Chrome V8 引擎的 javascript 运行时。

简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

入参

Node.js 环境下的入参包括 event、context 和 callback,其中 callback 为可选参数。

event:使用此参数传递触发事件数据。 context:使用此参数向您的处理程序传递运行时信息。 callback(可选):使用此参数用于将您所希望的信息返回给调用方。在 Node.js 8.9 和 6.10 版本中,均可以使用 callback 来返回。在 Node.js 10.15 中,使用 async 描述的入口函数,需要使用 return 关键字返回,非 async 模式的入口函数,需要使用 callback 入参返回。

  • 如果使用 callback 进行返回,语法为:
 callback(Error error, Object result);
  • error:可选参数,在函数执行内部失败时使用此参数返回错误内容。成功情况下可设置为 null。

  • result:可选参数,使用此参数返回函数成功的执行结果信息。参数需兼容 JSON.stringify 以便序列化为 JSON 格式。

  • 如果使用 return 关键字进行返回,可直接使用 return object 来返回一个对象或值。

  • 如果在代码中未调用 callback 或 return,云函数后台将会隐式调用,并且返回 null。

根据调用函数时的调用类型不同,返回值会有不同的处理方式。同步调用的返回值将会序列化为 JSON 格式后返回给调用方,异步调用的返回值将会被抛弃。同时,无论同步调用还是异步调用,返回值均会在函数日志中 ret_msg 位置显示

如果我们使用 php 来编写后端的代码时,需要 Apache 或者 nginx 的 HTTP 服务器,并配上 mod_php5 模块和 php-cgi。 从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求就不需要 PHP 来处理。 不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。 在我们创建 Node.js 第一个 "Hello, World!" 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的: 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。 接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。

NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用。 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

$ npm -v

升级

$ sudo npm install npm -g
  • 使用 npm 命令安装模块 npm 安装 Node.js 模块语法格式如下: $ npm install 

全局安装与本地安装 npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如 npm install express # 本地安装 npm install express -g # 全局安装

本地安装

  1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
  2. 可以通过 require() 来引入本地安装的包。 全局安装
  3. 将安装包放在 /usr/local 下或者你 node 的安装目录。
  4. 可以直接在命令行里使用。 如果你希望具备两者功能,则需要在两个地方安装它或使用 npm link。 接下来我们使用全局方式安装 express $ npm install express -g

卸载模块

我们可以使用以下命令来卸载 Node.js 模块。 $ npm uninstall express

卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看: $ npm ls

更新模块

我们可以使用以下命令更新模块: $ npm update express

搜索模块

使用以下来搜索模块: $ npm search express

创建模块 创建模块,package.json 文件是必不可少的

NPM 常用命令

使用npm help可查看所有命令。

使用npm help 可查看某条命令的详细帮助,

在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

使用npm update 可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

使用npm update -g可以把全局安装的对应命令行程序更新至最新版。

使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

使用npm unpublish @可以撤销发布自己发布过的某个版本代码。

使用淘宝 NPM 镜像

淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。 你可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

这样就可以使用 cnpm 命令来安装模块了: $ cnpm install [name]

 

  • Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。 Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。 执行 - 执行输入的数据结构 打印 - 输出结果 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。 Node 的交互式解释器可以很好的调试 Javascript 代码。

REPL 命令 ctrl + c - 退出当前终端。 ctrl + c 按下两次 - 退出 Node REPL。 ctrl + d - 退出 Node REPL. 向上/向下 键 - 查看输入的历史命令 tab 键 - 列出当前命令 .help - 列出使用命令 .break - 退出多行表达式 .clear - 退出多行表达式 .save filename - 保存当前的 Node REPL 会话到指定文件 .load filename - 载入当前 Node REPL 会话的文件内容。 停止 REPL 前面我们已经提到按下两次 ctrl + c 键就能退出 REPL:

  • Node.js 回调函数 Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。 例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。 回调函数一般作为函数的最后一个参数出现: function foo1(name, age, callback) { } function foo2(value, callback1, callback2) { } 阻塞代码实例 创建一个文件 input.txt ,内容如下:
创建 main.js 文件, 代码如下:
var fs = require("fs");

var data = fs.readFileSync(‘input.txt‘);

console.log(data.toString());
console.log("程序执行结束!");

非阻塞代码实例 创建一个文件 input.txt ,内容如下:

建 main.js 文件, 代码如下:
var fs = require("fs");

fs.readFile(‘input.txt‘, function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");
  • Node.js 事件循环 Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数. 事件驱动程序 Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。 当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。 这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO) 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

技术图片

个事件驱动的流程就是这么实现的,非常简洁。有点类似于观察者模式,事件相当于一个主题(Subject),而所有注册到这个事件上的处理函数相当于观察者(Observer)。 Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:

// 引入 events 模块
var events = require(‘events‘);
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

以下程序绑定事件处理程序:

// 绑定事件及事件的处理程序 eventEmitter.on(‘eventName‘, eventHandler); 我们可以通过程序触发事件:

// 触发事件
eventEmitter.emit(‘eventName‘);
实例
创建 main.js 文件,代码如下所示:
实例
// 引入 events 模块
var events = require(‘events‘);
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
 
// 创建事件处理程序
var connectHandler = function connected() {
   console.log(‘连接成功。‘);
  
   // 触发 data_received 事件 
   eventEmitter.emit(‘data_received‘);
}
 
// 绑定 connection 事件处理程序
eventEmitter.on(‘connection‘, connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on(‘data_received‘, function(){
   console.log(‘数据接收成功。‘);
});
 
// 触发 connection 事件 
eventEmitter.emit(‘connection‘);
 
console.log("程序执行完毕。");

接下来让我们执行以上代码: $ node main.js 连接成功。 数据接收成功。 程序执行完毕。 Node 应用程序是如何工作的? 在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数, 回调函数接收错误对象作为第一个参数。 接下来让我们来重新看下前面的实例,创建一个 input.txt ,文件内容如下: 菜鸟教程官网地址:www.runoob.com 创建 main.js 文件,代码如下:

var fs = require("fs");

fs.readFile(‘input.txt‘, function (err, data) {
   if (err){
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("程序执行完毕");

以上程序中 fs.readFile() 是异步函数用于读取文件。 如果在读取文件过程中发生错误,错误 err 对象就会输出错误信息。 如果没发生错误,readFile 跳过 err 对象的输出,文件内容就通过回调函数输出。

以上是关于Node.js的主要内容,如果未能解决你的问题,请参考以下文章

vscode代码片段建议bug

从Node.js Stream写入多个文件

Node.js与HTTP响应主体的unicode问题

节点 JS 不提供静态图像

你可能不知道的JavaScript代码片段和技巧(下)

你可能不知道的JavaScript代码片段和技巧(上)