一起来学习Node.js吧

494 阅读5分钟

最近我男神拍结婚照了,感觉受到了伤害,哎,难过死了!换了工作之后要上手Node了项目了,其实一直想学习来着,奈何没有项目,现在终于有了,哈哈哈哈哈哈,学起来!这篇文章讲了node的一个大概,适合不懂node想了解的同学!

什么是Node.js

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

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。

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

Node.js 全局对象

所有模块都可以调用

1)global:表示Node所在的全局环境,类似于浏览器中的window对象。

2)process:指向Node内置的process模块,允许开发者与当前进程互动。

例如你在DOS或终端窗口直接输入node,就会进入NODE的命令行方式(REPL环境)。退出要退出的话,可以输入 process.exit();

3)console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。

通常是写console.log(),

Node.js全局函数

1)定时器函数:共有4个,分别是setTimeout(), clearTimeout(), setInterval(), clearInterval()。
2)require:用于加载模块。

Node.js全局变量

1)_filename:指向当前运行的脚本文件名。

2)_dirname:指向当前运行的脚本所在的目录。

Node.js准全局变量

模块内部的局部变量,指向的对象根据模块不同而不同,但是所有模块都适用,可以看作是伪全局变量,主要为module, module.exports, exports等。

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

module.id 模块的识别符,通常是模块的文件名。
module.filename 模块的文件名。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回使用该模块的模块。

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

这里需要特别指出的是,exports变量实际上是一个指向module.exports对象的链接,等同在每个模块头部,有一行这样的命令。

var exports = module.exports;

这造成的结果是,在对外输出模块接口时,可以向exports对象添加方法,但是不能直接将exports变量指向一个函数:

exports.自定义模块 = function (x){ console.log(x);};

上面这样的写法是无效的,因为它切断了exports与module.exports之间的链接。但是,下面这样写是可以的。

Node.js模块化结构

Node.js采用模块化结构,按照CommonJS规范定义和使用模块。模块与文件是一一对应关系,即加载一个模块,实际上就是加载对应的一个模块文件。

require命令用于指定加载模块,加载时可以省略脚本文件的后缀名。

一、Node中的常用核心模块

http:提供HTTP服务器功能。

url:解析URL。

fs:与文件系统交互。

querystring:解析URL的查询字符串。

child_process:新建子进程。

util:提供一系列实用小工具。

path:处理文件路径。

crypto:提供加密和解密功能,基本上是对OpenSSL的包装。

传送门:https://github.com/chyingp/nodejs-learning-guide

二、自定义模块

Node模块采用CommonJS规范。只要符合这个规范,就可以自定义模块,如下

//test.js

module.exports =function(obj) {

    console.log(obj);

};

 

//main.js

var main = require('./test');

console.log('这是自定义模块:'+main('test~~~~~'));

 

 

//test

node main.js;

NodeJS的回调函数

Node.js 异步编程的直接体现就是回调

Node 使用了大量的回调函数,对于IO读取完成后,作为回调函数的参数返回,在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。阻塞是按顺序执行的,而非阻塞是不需要按顺序的。

var http = require('http');

http.createServer(function(request,response){

    response.writeHead(200,{'Content-Type':'text/plain'});

   response.write('-----hello,world\n');

    response.end();

}).listen(8887);

console.log('server running at http://127.0.0.1:8887/');

 

 

var fs = require(``'fs'``);

var data = fs.readFileSync('1.txt');

console.log(data.toString());

console.log('end');

NodeJS的事件循环、事件驱动

1、Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
2、Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
3、Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
4、Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
5、node.js 使用驱动模型时,当web server接收到请求

image.png

NodeJS的异常处理

Node是单线程运行环境,一旦抛出的异常没有被捕获,就会引起整个进程的崩溃。所以,Node的异常处理对于保证系统的稳定运行非常重要。

一般来说,Node有三种方法,传播一个错误。

  • 使用throw语句抛出一个错误对象,即抛出异常。
  • 将错误对象传递给回调函数,由回调函数负责发出错误。
  • 通过EventEmitter接口,发出一个error事件。

1.try…catch结构

try{

       process.nextTick(function () {

       throw  new Error("error");

});

} catch(err) {

  //can not catch it`

  console.log(err);

}

 

try {

setTimeout(function(){

throw new Error("error");

},1)

} catch(err) {

  //can not catch it

  console.log(err);

}

2.回调函数

function async2(continuation) {

  setTimeout(function() {

  try{

     var res = 42;

     if(true)

         throw  new  Error("woops!");

     else

         continuation(null, res); // pass 'null' for errorcatch(e) {

         continuation(e, ``null``);

     }

}, 2000);

}

 

async2(function(err, res) {

   if(err)

       console.log("Error: (cps) failed:", err);

    else

       console.log("(cps) received:", res);

 });
 // Error: (cps) failed: woops!`

3.EventEmitter接口的error事件

var EventEmitter = require('events').EventEmitter;

var emitter = new  EventEmitter();

 

emitter.emit('error'new  Error('something bad happened'));

 

//使用上面的代码必须小心,因为如果没有对error事件部署监听函数,会导致整个应用程序崩溃。所以,一般总是必须同时部署下面的代码。

 

emitter.on(``'error'``, function(err) {

      console.error(``'出错:'` `+ err.message);

});

Mac下node多版本管理

在实际开发过程中,我们会发现不同是项目可能需要不同的node版本,版本不对的话就会有一些莫名其妙的报错,这个时候,我们就需要node多版本管理工具了

传送门:blog.csdn.net/qq_40183053…