Nodejs

原创 2016年08月29日 16:33:22

node.js简介

Node.js采用C++语言编写而成,浏览器内核V8做为执行引擎;Node不是JS应用、而是一个Javascript的运行环境。Node保留了前端浏览器js的接口,没有改写语言本身的任何特性,依旧基于作用域和原型链。 Node.js 是一个为实时Web(Real-time Web)应用开发而诞生的平台,它从诞生之初就充分考虑了在实时响应、超大规模数据要求下架构的可扩展性。这使得它摒弃了传统平台依靠多线程来实现高并发的设计思路,而采用了单线程、异步式I/O、事件驱动式的程序设计模型。这些特性不仅带来了巨大的性能提升,还减少了多线程程序设计的复杂性,进而提高了开发效率。

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

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

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

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

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。

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

这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

请记住:Node.js 从来不是用于解决大规模计算问题而创建的。它的出现是为了解决大规模I/O 的问题,并且在这一点上做的非常好。

stream

通过nodejs实现,读取一个文件里面的内容并写入到另一个文件中

var fs = require('fs');
//创建一个可读流
var readerStream = fs.createReadStream('input.txt');
//创建一个可写流
var writerStream = fs.createWriteStream('output.txt');

//管道读写操作
//读取input.txt中的内容输出到output.txt中
readerStream.pipe(writerStream)

node中的模块引用

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

这样就可以在其他模块中引用hello.js

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

util

util 是node.js的一个核心模块,提供常用函数的集合,用于弥补核心JavaScript的功能过于精简的不足。

  • util.inherits
var util = require('util'); 
function Base() { 
    this.name = 'base'; 
    this.base = 1991; 
    this.sayHello = function() { 
    console.log('Hello ' + this.name); 
    }; 
} 
Base.prototype.showName = function() { 
    console.log(this.name);
}; 
function Sub() { 
    this.name = 'sub'; 
} 
util.inherits(Sub, Base); 
var objBase = new Base(); 
objBase.showName(); 
objBase.sayHello(); 
console.log(objBase); 
var objSub = new Sub(); 
objSub.showName(); 
//objSub.sayHello(); 
console.log(objSub); 

输出:

base 
Hello base 
{ name: 'base', base: 1991, sayHello: [Function] } 
sub 
{ name: 'sub' }

上述代码中,我们定义了一个Base函数和一个继承自Base的Sub函数,通过util.inherits() 来实现继承。

注意:Sub只继承了Base()在原型中定义的函数,Base函数中的base,sayHello属性并没继承。同时,在原型中定义的属性不会被console.log 作 为对象的属性输出。

  • util.inspect
    util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
    showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。
    depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多 少。如果不指定depth,默认会递归2层,指定为 null 表示将不限递归层数完整遍历对象。 如果color 值为 true,输出格式将会以ANSI 颜色编码,通常用于在终端显示更漂亮 的效果。
    特别要指出的是,util.inspect 并不会简单地直接把对象转换为字符串,即使该对 象定义了toString 方法也不会调用。

  • util.isArray(object)
    如果给定的参数“object”是一个数组返回true,否则返回false。

  • util.isRegExp(object)
    如果给定的参数是一个正则表达式返回true,否者false。

  • util.isDate(object)
    如果给定的参数是日期返回的是true,否则false。

  • util.isError(object)
    如果给定的参数是一个错误的对象返回true,否则false。

node.js文件系统

node.js提供一组类似UNIX(POSIX)标准的文件操作API。Node导入文件系统模块(fs)语法如下:

var fs = require('fs');
  • 异步和同步
    Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。
    建议大家是用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

  • 打开文件
    fs.open(path,flags{,mode},callback);
    flags - 文件打开的行为。
    mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。

  • 获取文件信息
    通过异步模式获取文件信息的语法格式:
fs.stat(path,callback)

callback-回调函数,带有两个参数:(err,stats),stats是fs.Stats对象。

  • 写入文件
fs.writeFile(filename,data[,options],callback)

data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。
options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’

  • 读取文件
fs.read(fd,buffer,offset,length,position,callback)

fd - 通过 fs.open() 方法返回的文件描述符。
buffer - 数据写入的缓冲区。
offset - 缓冲区写入的写入偏移量。
length - 要从文件中读取的字节数。
position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
- 关闭文件

fs.close(fd,callback);

fd - 通过 fs.open() 方法返回的文件描述符。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【旧代码整理】Nodejs的另类用法

Nodejs 的中文维基百科介绍:https://zh.wikipedia.org/wiki/Node.js Nodejs 可以 在linux命令行执行js代码。 比如: var a = 1; ...
  • joyatonce
  • joyatonce
  • 2016年07月16日 10:39
  • 1352

nodejs-硬连接符号连接

硬链接:我们一个文件一般只有一个文件名,这个文件名相当于一个硬链接,我们用特殊方法,让一个文件有多个文件名,这样的方法叫创建硬链接,如为文件1创建一个硬链接文件2,那么这文件1和文件2在硬盘上实质是同...
  • songmaolin_csdn
  • songmaolin_csdn
  • 2016年10月25日 13:22
  • 1187

nodejs读取图片返回给浏览器显示

本文主要是使用nodejs处理图片等资源返回给浏览器显示方法,但不只限制于图片,也可以是音频视频等其他非字符串文件的返回和显示。也可以扩展成nodejs静态资源服务器的开发方法。...
  • dong123dddd
  • dong123dddd
  • 2016年06月21日 20:21
  • 7398

NodeJs -JavaScript 面向对象编程-关于继承的简单实现

刚刚把一个小项目中的过程方式写的代码重构为面向对象,实现一个简单的继承关系。 关于JavaScript 中原型继承我这里不多说,概念的东西我也不多重复。总是继承实现的核心就是prototype (...
  • Dearlv
  • Dearlv
  • 2014年03月12日 23:55
  • 1998

纯Java网站开发改造为nodejs混合编程

如何利用nodejs加速java制作的网站,进行改造混合开发.
  • u012516358
  • u012516358
  • 2015年05月17日 19:24
  • 4205

NodeJS 垃圾回收

关于nodeJS垃圾回收机制的讲解文章很多,这里我就不再重复,下面记录了一下我在工作中遇到的问题。nodejs 在64位电脑可用内存为1.4G,这是V8的内存机制决定的,目前我司所用版本比较陈旧为V4...
  • songzhusheren
  • songzhusheren
  • 2017年02月20日 23:17
  • 817

nodejs中的==、===、!=、!==的区别

当这个逻辑运算符长度为 2 的时候(==, !=),只是判断外在的值是不是一样的,而不会判断类型。如 var a = 1, b = "1"; console.log(a == b); ...
  • UP19910522
  • UP19910522
  • 2013年10月23日 21:35
  • 2370

深入浅出NodeJS——内存控制

V8虚拟机的内存回收机制,和Java虚拟机类似采用分代回收机制,分为新生代和老生代,当满足一定条件新生代对象会晋级到老生代。利用Node在服务端编程要小心内存泄露问题,一个小的泄露由于大量并发访问可能...
  • changer328
  • changer328
  • 2014年07月27日 19:36
  • 3637

nodejs做成服务

一、先弄到两个小工具(微软自已出的小工具): srvinstw.exe srvany.exe 本文附件里有这两个工具 http://download.csdn.net/detail/shaos...
  • shaoshuaiqilin
  • shaoshuaiqilin
  • 2016年04月27日 16:31
  • 979

nodejs实现登录注册系统

nodejs实现登录注册系统对上一次的功能进一步的完善,将用户的数据储存在本地数据库,实现登录的功能,采用session机制记录登录信息,使得已登录的用户保持登录状态目录结构目录结构比较简单,算是一个...
  • cramon
  • cramon
  • 2017年02月11日 15:10
  • 2313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Nodejs
举报原因:
原因补充:

(最多只允许输入30个字)