node.js学习-1

Node.js,不是一种语言,而是一种解析Javascript的运行环境,只是运行在服务端。Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的API,如文件操作、网络编程等。浏览器端的Javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限。相比之下,Node.js则是一个全面的后台运行时,为Javascript提供了其他语言能够实现的许多功能。

API文档地址: http://www.jq-school.com/api/nodejs/api.html

下面是几个特性:
1.事件驱动,简单的说就是先注册N个回调函数,待发生事件时调用。
2.单线程
没用过这个,最近工作需要,强学。

安装完开发环境后,先按照例子尝试了一个helloword。

var http = require('http');

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/');

对于我这种十年前用过js的准文盲,先温习下大概的js语法。
1.都用var来定

function foo() {}
var a = 0;
var b = 'a';
var c = 1.0;
var d = foo;

2.基本数据

var int1 = 123;
var string1 = "3";
var bool1 = false;
var list1 = ["1", "2", "3"];
var map1 = {
"key1":"value1",
"key2":"value2",
"key3":"value3"
};son子串 

3.json

var dog = {
  "pre" : "嘘~",
  "sub" : {
    "name" : "蛋花汤",
    "act"  : "在睡觉",
    "time" : 12
    },
  "suf" : [ "我说了", "它在睡觉", "就是在睡觉" ]
};

console.log(dog.pre);

4.类
js中的类,严格说就是个函数体,里面的this.不能忽略,忽略了就不算他的成员属性了。要用的时候直接new Object。

function parentFunc ()
{
    this.id = 1;
    this.childfunc = function childFunc()
    {
        return this.id+1;
    }

}

var parentFuncObj = new parentFunc();
console.log(parentFuncObj.id);
console.log(parentFuncObj.childfunc()); 

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

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");

readFile是异步读取文件的api。

EventEmitter 类:

这个类有点类似于安卓里的addListener后事件触发时激发对应listener的逻辑。

var EventEmitter = require('events').EventEmitter;  
var event = new EventEmitter(); //获取一个对象
event.on('some_event', function() { 
    console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000); //过1秒钟触发some_event

下面这个就相当于注册了多个listener

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

还有removeListener等函数:

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
var callback = function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
};

emitter.on('someEvent', callback); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 
emitter.removeListener("someEvent", callback);

emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 

输出:

listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数
listener1 arg1 参数 arg2 参数

当然还有 removeAllListeners、once等不同用途的方法。

Node.js Buffer(缓冲区)
js在处理二进制信息时,需要用到Buffer这个类。该类用来创建一个专门存放二进制数据的缓存区。
在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

var buf = new Buffer(10);
var length = buf.write("asdfasdfazsdfasdf");
console.log("length"+length);
console.log( buf.toString('ascii'));

buffer能自定义初始长度,如果超过了,则只能写初始长度。
具体的其他方法可见api

模块系统:
那么不同js文件之间,怎么互相调用呢?比如我们写c程序,有export等标识符。这个也有。
比如,我们先写个hello.js

var text = "hello";
exports.printit = function()
{
    console.log(text);
}

这里的exports代表这个类中的这个函数可以让另外一个模块调用。
然后写个print.js:

var module = require("./hello");
module.printit();

这样就行了。

当然也可以定义成类的模式,一次暴露出多个公共方法:

function printclass()
{

    var text = "hello";
    this.printit = function()
    {
        console.log(text);
    } 
    this.printit2 = function()
    {
        console.log(text);
    }
}

module.exports = printclass;
var module = require("./hello");
newObj = new module()
newObj.printit();
newObj.printit2();

require方法接受以下几种参数的传递:
http、fs、path等,原生模块。
./mod或../mod,相对路径的文件模块。
/pathtomodule/mod,绝对路径的文件模块。
mod,非原生模块的文件模块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值