NodeJS

简单的说 Node.js 就是运行在服务端的 JavaScript。

使用 Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器。

组成:

例子:

// 我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http

var http = require('http');//使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。 函数通过 request, response 参数来接收和响应数据。http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n');}).listen(8888);// 终端打印如下信息console.log('Server running at http://127.0.0.1:8888/');

NPM:

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

l 允许用户从NPM服务器下载别人编写的第三方包到本地使用。

扫描二维码关注公众号,回复: 64427 查看本文章

l 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。

l 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

可以通过输入 "npm -v" 来测试是否成功安装。

使用npm命令安装模块:

例子:

npm install express // 安装常用的Node.js web框架模块express

安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。

var express = require('express');

全局安装与本地安装:

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

npm install express # 本地安装 npm install express -g # 全局安装

如果出现以下错误:

npm err! Error: connect ECONNREFUSED 127.0.0.1:8087

解决办法为:

$ npm config set proxy null

本地安装

l 1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。

l 2. 可以通过 require() 来引入本地安装的包。

全局安装

l 1. 将安装包放在 /usr/local 下或者你 node 的安装目录。

l 2. 可以直接在命令行里使用。

npm list -g //查询所有全局安装的模块

package.json 位于模块的目录下,用于定义包的属性。位于 node_modules/express/package.json。

npm uninstall express //卸载模块

npm ls //看包

npm update express //更新模块

npm search express //搜索模块

创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。

版本号(略)

https://docs.npmjs.com/ 官方文档

http://npm.taobao.org/ 淘宝NPM镜像

镜像(Mirroring)是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。

变量声明需要使用 var 关键字,如果没有使用 var 关键字变量会直接打印出来。

使用 var 关键字的变量可以使用 console.log() 来输出变量。

多行表达式:

... 三个点的符号是系统自动生成的,你回车换行后即可。Node 会自动检测是否为连续的表达式。

可以使用下划线(_)获取上一个表达式的运算结果。

REPL 命令:

异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。

回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。

第一个实例在文件读取完后才执行完程序。 第二个实例我们不需要等待文件读取完,这样就可以在读取文件时同时执行接下来的代码,大大提高了程序的性能。阻塞是按顺序执行的,而非阻塞是不需要按顺序的,所以如果需要处理回调函数的参数,我们就需要写在回调函数内。

Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。

Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。

Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

事件驱动程序:

当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。

这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类(事件触发与事件监听器功能的封装)来绑定和监听事件:

例子:

on 函数用于绑定事件函数,emit 属性用于触发一个事件。

其他方法(略)

EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。

记得err事件的处理!

大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。

Node.js Buffer(缓冲区):

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

创建Buffer类:

输出结果:

写入缓冲区:

例子:

buf= Buffer.alloc(256).write("www.baidu.com");

//alloc()括号内是空间容量 不够的haul 则只会写入string的一部分

console.log("写入字节数:"+buf);

从缓冲区读取数据:

例子:

将 Buffer 转换为 JSON 对象:

例子:

其他方法(略)

Node.js Stream(流):

http://www.runoob.com/nodejs/nodejs-stream.html

Node.js模块系统:

一个 Node.js 文件就是一个模块

创建一个main.js文件

var hello=require('./hello');

hello.world();

在创建一个hello.js文件

exports.world=function(){

console.log('Hello World');

}

Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。

例子:

有时候我们只是想把一个对象封装到模块中:

//hello.js function Hello() { var name; this.setName = function(thyName) { name = thyName; }; this.sayHello = function() { console.log('Hello ' + name); }; }; module.exports = Hello;

这样就可以直接获得这个对象了:

//main.js var Hello = require('./hello'); hello = new Hello(); hello.setName('BYVoid'); hello.sayHello();

模块接口的唯一变化是使用 module.exports = Hello 代替了exports.world = function(){}。 在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的 exports。

服务端的模块放在哪里:

Node.js路由:

http://www.runoob.com/nodejs/nodejs-router.html

Node.js 中的全局对象是 global。

注意: 永远使用 var 定义变量以避免引入全局变量,因为全局变量会污染 命名空间,提高代码的耦合风险。http://www.runoob.com/nodejs/nodejs-global-object.html

Node.js常用工具:

http://www.runoob.com/nodejs/nodejs-util.html

猜你喜欢

转载自www.cnblogs.com/kz2017/p/8945046.html