Nodejs

来源:互联网 发布:数据库检索系统 编辑:程序博客网 时间:2024/06/05 06:41

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.jsfunction Hello(){    var name;    this.setName = funciton(thyName){            name = thyName;    };    this.sayHello = function(){            console.log('Hello'+name);    };};module.exports = Hello;

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

//main.jsvar 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() 方法返回的文件描述符。

0 0
原创粉丝点击