【转载】Node.js教程(菜鸟教程系列)
很好的⼀篇教程:
简单做下笔记
概述
简单的说 Node.js 就是运⾏在服务端的 JavaScript。
Node.js 是⼀个基于Chrome JavaScript 运⾏时建⽴的⼀个平台。
Node.js是⼀个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执⾏Javascript的速度⾮常快,性能⾮常好。
安装
win下安装后⾃动配置环境变量,重启后可⽤
NPM
NPM是随同NodeJS⼀起安装的包管理⼯具,能解决NodeJS代码部署上的很多问题,常见的使⽤场景有以下⼏种:
允许⽤户从NPM服务器下载别⼈编写的第三⽅包到本地使⽤。
允许⽤户从NPM服务器下载并安装别⼈编写的命令⾏程序到本地使⽤。
允许⽤户将⾃⼰编写的包或命令⾏程序上传到NPM服务器供别⼈使⽤。
npm 安装 Node.js 模块语法格式如下:
npm install <Module Name>
我们使⽤ npm 命令安装常⽤的 Node.js web框架模块 express:
npm install express
安装好之后,express 包就放在了⼯程⽬录下的 node_modules ⽬录中,因此在代码中只需要通过 require('express') 的⽅式就好,⽆需指定第三⽅包路径。
var express = require('express');
创建服务器
var http = require('http');
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应数据 "Hello World"
}).listen(8888);
// 终端打印如下信息
console.log('Server running at 127.0.0.1:8888/');
第⼀⾏请求(require)Node.js ⾃带的 http 模块,并且把它赋值给 http 变量。
接下来我们调⽤ http 模块提供的函数: createServer 。这个函数会返回⼀个对象,这个对象有⼀个叫做 listen 的⽅法,这个⽅法有⼀个数值参数,指定这个 HTTP 服务器监听的端⼝号。
Node.js 回调函数
Node.js 异步编程的直接体现就是回调。
异步编程依托于回调来实现,但不能说使⽤了回调后程序就异步化了。
回调函数在完成任务后就会被调⽤,Node 使⽤了⼤量的回调函数,Node 所有 API 都⽀持回调函数。
执⾏异步操作的函数将回调函数作为最后⼀个参数,回调函数接收错误对象作为第⼀个参数。
var fs = require("fs");
if (err){
console.log(err.stack);
return;
}
console.String());
});
console.log("程序执⾏完毕");
Node.js 事件循环
Node.js 是单进程单线程应⽤程序,但是通过事件和回调⽀持并发,所以性能⾮常⾼。
Node.js 的每⼀个 API 都是异步的,并作为⼀个独⽴线程运⾏,使⽤异步函数调⽤,并处理并发。
Node.js 基本上所有的事件机制都是⽤设计模式中观察者模式实现。
Node.js 单线程类似进⼊⼀个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都⽣成⼀个事件观察者,如果有事件发⽣就调⽤该回调函数.
事件驱动程序
Node.js 使⽤事件驱动模型,当web server接收到请求,就把它关闭然后进⾏处理,然后去服务下⼀个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给⽤户。
这个模型⾮常⾼效可扩展性⾮常强,因为webserver⼀直接受请求⽽不等待任何读写操作。(这也被称之为⾮阻塞式IO或者事件驱动IO)
在事件驱动模型中,会⽣成⼀个主循环来监听事件,当检测到事件时触发回调函数。
整个事件驱动的流程就是这么实现的,⾮常简洁。有点类似于观察者模式,事件相当于⼀个主题(Subject),⽽所有注册到这个事件上的处理函数相当于观察者(Observer)。
Node.js 有多个内置的事件,我们可以通过引⼊ events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
// 引⼊ events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
}
// 绑定 connection 事件处理程序
<('connection', connectHandler);
// 使⽤匿名函数绑定 data_received 事件
<('data_received', function(){
console.log('数据接收成功。');
});
// 触发 connection 事件
console.log("程序执⾏完毕。");
EventEmitter 类
events 模块只提供了⼀个对象: events.EventEmitter。EventEmitter 的核⼼就是事件触发与事件功能的封装。
你可以通过require("events");来访问该模块。
EventEmitter 的每个事件由⼀个事件名和若⼲个参数组成,事件名是⼀个字符串,通常表达⼀定的语义。对于每个事件,EventEmitter ⽀持若⼲个事件。
当事件触发时,注册到这个事件的事件被依次调⽤,事件参数作为回调函数参数传递。
//event.js ⽂件
var events = require('events');
var emitter = new events.EventEmitter();
<('someEvent', function(arg1, arg2) {
console.log('listener1', arg1, arg2);
});
<('someEvent', function(arg1, arg2) {
console.log('listener2', arg1, arg2);
});
EventEmitter 提供了多个属性,如 on 和 emit。on 函数⽤于绑定事件函数,emit 属性⽤于触发⼀个事件。
Node.js 函数
⼀个函数可以作为另⼀个函数接收⼀个参数,把 say 函数作为execute函数的第⼀个变量进⾏了传递。这⾥返回的不是 say 的返回值,⽽是say 本⾝!
function say(word) {
console.log(word);
}
function execute(someFunction, value) {
someFunction(value);
}
execute(say, "Hello");
匿名函数
function execute(someFunction, value) {
someFunction(value);
}
execute(function(word){ console.log(word) }, "Hello");
简约⽽不简单的HTTP服务器
var http = require("http");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello World");
}).listen(8888);
Node.js GET/POST请求
获取 URL 的参数
nodejs到底是干嘛用的呢node.js中url模块中的parse函数提供了这个功能,在浏览器中访问 localhost:3000/user?name=菜鸟教程&url=www.runoob
var http = require('http');
var url = require('url');
var util = require('util');
res.writeHead(200, {'Content-Type': 'text/plain'});
// 解析 url 参数
var params = url.parse(req.url, true).query;
res.write("⽹站名:" + params.name);
res.write("\n");
res.write("⽹站 URL:" + params.url);
}).listen(3000);
获取 POST 请求内容
var http = require('http');
var querystring = require('querystring');
// 定义了⼀个post变量,⽤于暂存请求体的信息
var post = '';
// 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
<('data', function(chunk){
post += chunk;
});
// 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。 ('end', function(){
post = querystring.parse(post);
});
}).listen(3000);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论