文档章节

node.js

Mrseven
 Mrseven
发布于 2016/05/31 16:15
字数 3224
阅读 15
收藏 0

一、简介

        node.js 是javascript的服务器运行环境。内部采用Google的V8引擎。模块化结构。

        node的目标在于“提供一种简单的构造可伸缩网络程序的方法”。

        

        特点:

             1、单线程异步操作

        模块加载:

             如: require("http"); 或者: require("./circle.js");

        node约定:

            回调函数一定是是某个函数的最后一个参数,回调函数的第一个参数一定是上一步传入的错误对象

  db.User.get(userId, function(err, user) {
    if(err) {
      throw err
    }
    // ...
  })

         node.js 的核心模块(优先加载):

            1、http:提供http服务器功能。

            2、url:解析url

            3、fs:与文件系统交互

            4、querystring:解析url的查询字符串

            5、child_process:新建子进程

            6、util :提供一系列的使用小工具

            7、path:处理文件路径

            8、crypto:提供加密和解密功能。

        安装时,核心模块就会被编译成二进制文件。

        

        node.js  的自定义模块:

            规范:CommonJS 规范

        

 node.js  的异常处理:

        node.js 是单线程,如果出现错误,就会导致整个系统崩溃。

        处理异常方式:

  1.    try....catch  进行异常捕获
  2.    回调函数。
  3. EventEmitter 接口的error事件        

node.js 命令行脚本:

    1、执行foo.js  文件

node foo.js

 

 

二、CommonJS规范

     node.js 是由多个模块组成的,每个模块都是一个文件并且每个模块都遵循CommonJS规范。

     每一个模块一个作用域。例如  example.js是一个模块,那么里边定义的变量就只有在example.js 中能用,在其他文件中无效 。

    定义全局变量:

global.warning = 'you have a warning';

    CommonJS 规定,每个文件的对外接口是module.exports 对象,这个对象的所有方法和属性都可以被其他文件导入。

// example.js
var x = 5
module.export.x = x;
// index.js    调用
var example = require("example.js");
console.log(example.x);

//  5

CommonJS模块的特点:

    1、所有的代码都运行在模块作用域,不会污染全局作用域。

    2、模块可以多次加载,但是只在第一次加载是运行一次,然后结果被缓存,再次加载就读取缓存中的结果,

    3、模块加载顺序就是代码中的出现顺序。

 

module 对象

    node 内部提供一个module构建函数,每个模块内部都有一个module函数。属性如下:

    module.id    模块的识别符,通常是带有绝对路径的模块文件名。

    module.filename  模块的文件名,带有绝对路径

    module.loaded  返回一个布尔值,表示模块是否加载完成

    module.parent 返回一个对象,表示调用该模块的模块

    module.children  返回一个数组,表示该模块要用到的其他模块

    module.exports  表示模块对外输出的值

    

    module.exports 属性:

        表示当前模块对外输出的接口,其他文件加载该模块,其实就是读取module.exports 的值。

    

    exports 变量:

        为了方便,node 为每个模块提供了一个exports 变量,指向module.exports ,这就等同于在每个模块的头部都有这样一个命令:

var exports = module.exports;

        exports  添加属性:

exports.a = function(){
     console.log('hahha');
}
exports.a = 1;

    

    如果一个模块对的对外接口,就是一个单一的值,就只能使用module.exports 输出。

module.exports = function(x){
    console.log(x);
}

     module.exports 和 exports 的区别:

        1、exports 是对 module.exports  的引用(这两个是指向同一个内存地址,当exports 发生改变时,module.exports 也会发生改变)

        2、两者的初始值都是{}

        3、require() 返回的是module.exports ,而不是exports。

         使用exports变量添加属性,代码示例:

//使用exports 

var name = 'hello world';
exports.name = name;
exports.sayName = function(){
    console.log(name);
}

      上面这段代码 就相当于 module.exports ,代码示例:

//使用 module.exports

var name = 'hello world';
module.exports.name = name;
module.exports.sayName = function(){
    console.log(name);
}

        注意:使用如下方式,程序会报错,因为exports 进行了覆盖,也就是说exports指向了一块新的内存,那么exports和module.exports 不再指向同一块内存。exports 变量只能添加属性。

exports = function(){
    console.log("hello world!");
}

    如果exports和module.exports 比较难区分,那就放弃使用exports。

    

    AMD规范和CommonJS规范

        CommonJS 规范加载模块式同步的,AMD规范是非同步加载。

        服务器编程,模块文件一般存在于本地硬盘,加载很快,所以使用CommonJS规范就能满足。

        浏览器环境,要从服务器加载模块,所以要采用AMD规范。

 

        AMD规范的语法如下:

define(['package/lib'], function(lib){
  function foo(){
    lib.log('hello world!');
  }

  return {
    foo: foo
  };
});

    

 

    require 命令:

        使用CommonJS规范,内置的require命令用于加载模块文件。

        require 读取并执行一个js 文件,并返回exports对象。

        加载规则:

var foo = require('foo');
//  等同于
var foo = require('foo.js');

        参数:

                1、如果已“/” 开头,就是绝对路径

                2、如果以“./” 开头,相对路径

                3、如果不以“/”  或者  “./”  开头,就加载默认提供的核心模块文件。(在node的安装目录下)

                 【未完待续。。。。】

        

        模块缓存:

                每次加载模块之后,就会放入缓存中,等到下次再加载是就直接从缓存中取出。

                删除缓存:

// 删除指定模块的缓存
delete require.cache[moduleName];

// 删除所有模块的缓存
Object.keys(require.cache).forEach(function(key) {
  delete require.cache[key];
})

                

            CommonJS模块的加载机制是,输入的是被输出的值的拷贝。一旦输出值,模块内部的变化都不会影响这个值得改变。

            

 

三、package.json  文件

        每个项目的根目录下都有一个package.json 文件,定义了这个项目的各种模块以及项目的配置信息。

        单独安装模块:

npm install express --save
npm install express --save-dev

        --save  表示将该模块的信息写入package.json 的  dependencies 属性中,

    --save-deb  表示将该模块的信息写入package.json 的devDependencies属性中。

 

 

四、npm 模块管理器

        定义:1、是node.js  开放式的模块登记和管理系统

                        2、是node.js  默认的模块管理器,用来安装和管理node模块。

npm init 

       npm init  表示初始化生成一个新的package.json 文件。

npm set init-author-name 'Your name'

        npm  set  设置环境变量

npm info  name 

        npm  info  查看某个模块的具体信息

npm  search <搜索词>

        npm search  用于搜索npm 仓库中,后面可以跟字符串或者正则。

npm list
npm list -global
npm list underscore  //单个模块

        npm list  查看当前项目安装的所有模块,以及依赖模块

npm install <模块名称>  // 本地安装
npm install -g <模块名称>  // 全局安装
npm install <模块名称>  --force  //强制安装
npm install <模块名称>@latest   // 安装最新版本

        npm  install 用于安装模块,安装分为“全局安装”和“本地安装”,

npm update <模块名称>  //本地更新
npm update -global <模块名称>  //全局更新

        npm  update  更新模块版本,从npm v2.6.1开始,只更新顶层模块,不更新依赖的依赖。

npm uninstall <模块名称>  //本地删除
npm uninstall -global <模块名称> // 全局删除

        npm  uninstall  卸载模块

npm adduser

        用于在npmjs.com 注册用户

npm publish  // 发布模块
npm login //用户登录(npmjs.com)

        将当前模块发布到npmjs.com

npm deprecate  <模块名称>@版本 // 废弃某个版本的某个模块

 

 

 

 

五、FS模块

    fs是filesystem的缩写,提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装。该模块提供所有操作的同步和异步操作方式。

    1、readFileSync()  : 同步读取文件,返回一个字符串

var text = fs.readFileSync(fileName, "utf8");

    2、writeFileSync():同步写入文件

fs.writeFileSync(fileName, str, 'utf8');

    3、exists():判断给的路径是否存在,不管结果如何都会回调函数

fs.exists('/path/to/file', function (exists) {
  util.debug(exists ? "it's there" : "no file!");
});

    不要再open前调用exists   , 因为open本身就是检查文件是否存在

    4、mkdir():    新建目录(异步)

           writeFile():  写入文件(异步)

           readFile():读取文件内容   (异步)

// 创建目录
fs.mkdir("./hellodir", 0777, function(err){
	if(err){
		 throw err;
	} else{
		console.log('创建成功');
	}
});


// 写入文件
fs.writeFile('./hellodir/message.txt', 'hello node', function(err){
	if(err){
		throw err;
	} else {
		console.log('创建成功');
	}
});


// 读取文件
fs.readFile('./hellodir/message.txt', 'utf8', function(err, data){
	if(err){
		throw err;
	} else{
		console.log(data);
	}
});

      

    5、mkdirSync():建立目录(同步)

          writeFileSync() :写入文件(同步)

           readFileSync():读取文件(同步)

// 创建目录
fs.mkdirSync('./hellodirSync', 0777);
// 写入文件
fs.writeFileSync('./hellodirSync/message.txt', 'hello node');
// 读取文件
var content = fs.readFileSync('./hellodirSync/message.txt', 'UTF-8');
console.log(content);

    6、readdir():读取目录,返回一个所包含的文件和一个子目录函数

fs.readdir('./first', function(err, data){
	if(err){
		throw err;
	} else {
		console.log(data);
	}
});

    7、stat方法的参数是一个文件或目录,它产生一个对象,该对象包含了该文件或目录的具体信息。我们往往通过该方法,判断

        正在处理的到底是一个文件,还是一个目录

fs.readdir('./first', function(err, files){
	if(err){
		throw err;
	} else {
		files.forEach(function(file){
			fs.stat('./first', function(err, stats){
				if(err){
					throw err;
				} else{
					if(stats.isFile()){
						console.log("%s is file", file);
					} else if(stats.isDirectory()){
						console.log("%s is directory", file);
					}
					console.log('stats:  %s',JSON.stringify(stats));
				}
			});
		});
	}
});

    8、watchFile():监听文件,当文件发生改变时就执行回调函数

// 监听文件
fs.watchFile('./hellodirSync/message.txt',function(curr, prev){
	console.log('the current mtime is: ' + curr.mtime);
  console.log('the previous mtime was: ' + prev.mtime);
});

fs.writeFile('./hellodirSync/message.txt', 'hello world!', function(err){
	if(err){
		throw err;
	} else{
		console.log('修改成功');
	}
});

//解除文件监听
fs.unwatchFile('./hellodirSync/message.txt');

        9、createReadStream():通过文件流的方式读取大型文件。

        10、createWriteStream() :通过数据流的方式写入文件。

 

 

六:path模块

    1、path.join()  连接路径

var path = require("path");
var url = path.join('hello', 'foo');
console.log(url);

        2、path.resolve():将相对路径转换成绝对路径

        3、accessSync():同步读取一个路径

        4、path.relative() :接受两个参数,这两个参数都应该是绝对路径。该方法返回第二个路径想对于地一个路径的系那个相对路径

 

 

 

七、process对象

    是node的一个全局对象,提供node 的进程信息。

        1、退出码:

                    0---正常退出

                    1---发生为捕获错误

                    5---V8执行错误

                    8---不正确的参数

                    128+信号值---如果node接收到退出信号,它的退出码就是128加上信号值,退出码的后七位是信号值

        2、process属性(返回系统信息)

            process.argv : 返回当前进程的命令行参数数组

            process.env : 返回一个对象,成员为当前Shell的环境变量

            process.installPrefix: node安装路径的前缀

            process.pid : 当前进程的进程号

            process.platform :当前系统平台

            process.title: 默认值为“node”,可以更改

            process.version: node版本

 

        3、stdout : 标准输出

               stdin  : 标准输入

               stderr: 标准错误

        4、process 方法

                process.childir():切换工作目录到指定目录

                process.cwd():返回运行当前脚本的工作目录的路径

                process.exit():退出当前进程

                process.getgid():返回当前进程的组ID(数值)

                process.getuid():返回当前进程的用户ID(数值)

                process.nextTick():指定回调函数在当前执行栈的尾部、下一次Event Loop之前执行

                process.on():监听事件

                process.setgid():指定当前进程的组,可以使用数字ID,也可以使用字符串ID

                process.setuid():指定当前进程的用户,可以使用数字ID,也可以使用字符串ID

 

        

                

八:Buffer对象

        是node.js用来处理二进制数据的一个借口。该对象是一个构造函数。

        是node原生提供的全局对象,可以直接使用,不需要通过require("Buffer")。

        支持一下编码格式:ascii, utf8, utf16le, ucs2, base64, hex

        类方法:

        1、Buffer.isEncoding():是否为指定的编码,返回一个布尔值

        2、Buffer.isBuffer():参数为对象,返回布尔值,表示是否为Buffer实例

        3、Buffer.byteLength():实际字符串占据的长度,默认编码为UTF8

        4、Buffer.concat():将多个Buffer对象组合成一个Buffer对象

        实例属性:

        1、length:返回Buffer对象所占的内存长度

        2、write():向指定的Buffer对象总写入数据

        3、slice():返回一个按照指定位置、从原对象切割出来的Buffer实例

        4、toString():将Buffer对象转换成字符串

        5、toJson():将Buffer对象转换成json数据

 

 

 

九:Events 对象

        是node对“发布/订阅”模式的实现,一个对象通过这个模块向另外一个对象传递消息。

        

十:Stream 接口

        Stream把较大的数据拆分成很小的部分,不论是硬盘数据、网络数据、内存数据都可以使用Stream读取。

            特点:通过事件通信。

 

 

十一:child_process 子进程

            child_process 用于创建子进程。子进程的运行结果存储在系统缓存之中(最大200kb),等到子进程结束以后,主进程再用

回调函数读取子进程的运行结果。

            1、exec():参数是一个命令字符串

var child_process = require("child_process").exec;
child = child_process('ls -l');
child.stdout.on('data', function(data){
	console.log('stdout:'+data);
});
child.stderr.on('data', function(data){
	console.log('stdout:'+data);
});
child.on('close', function(code){
	console.log('closing code:'+code);
});

            2、execSync():是exec() 同步执行版本。

            3、execFile():执行特定的程序,不会被bash解释,具有较高的安全性

            4、spawn():创建一个子进程来执行特定的命令,

            5、fork():创建一个子进程,执行node脚本。fork('./node.js')相当于spawn('node', ['./node.js']).

            6、send():在用fork() 创建一个子进程之后,就可以使用send() 给子进程

            

© 著作权归作者所有

上一篇: nodejs 代理
下一篇: 安装express
Mrseven
粉丝 0
博文 52
码字总数 39044
作品 0
朝阳
程序员
私信 提问
加载中

评论(0)

暂无文章

在两个日期之间查找对象MongoDB

我一直在围绕在mongodb中存储推文,每个对象看起来像这样: {"_id" : ObjectId("4c02c58de500fe1be1000005"),"contributors" : null,"text" : "Hello world","user" : { "following......

javail
15分钟前
35
0
《aelf经济和治理白皮书》重磅发布:为DAPP提供治理高效、价值驱动的生态环境

2020年2月17日,aelf正式发布《aelf经济和治理白皮书》,这是aelf继项目白皮书后,在aelf网络经济模型和治理模式方面的权威论述。 《aelf经济和治理白皮书》描述了aelf生态中各个角色及利益的...

AELF开发者社区
26分钟前
44
0
EditText的首字母大写

我正在开发一个小小的个人待办事项列表应用程序,到目前为止,一切都运行良好。 我想知道一个小怪癖。 每当我去添加一个新项目时,我都会看到一个带有EditText视图的Dialog。 当我选择EditT...

技术盛宴
30分钟前
30
0
战疫 | 高德工程师如何在3天上线“医护专车”

新冠状病毒肺炎疫情突袭,无数医护人员放弃与家人团聚,明知凶险,仍然奋战在一线。但因为武汉公交、地铁、网约车停运,医护人员上下班很难。白衣天使疾呼打车难。 (截图摘自《财经国家周刊...

amap_tech
38分钟前
41
0
img在IE中无法按比例显示

在IE浏览器中使用img标签当给img标签设置width:98%时,显示时还是会把img的原始高度显示出来 解决方式给父标签设置width,但width不能使用100%需要指定一个值 <div style="width:900px;"> ...

有理想的鸭子
38分钟前
45
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部