- Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
- 安装node.js,
- 安装成功后,helloworld
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/');
cmd中输入以下命令:
node server.jsServer running at http://127.0.0.1:8888/
接下来,打开浏览器访问 ,你会看到一个写着 "Hello World"的网页。
- 安装npm,高版本的nodejs自带npm,可以安装淘宝镜像
- Node.js 回调函数,非租塞 读取文件示例:
var fs = require("fs");fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString());});console.log("程序执行结束!");
- Node.js 事件驱动示例:
// 引入 events 模块var events = require('events');// 创建 eventEmitter 对象var eventEmitter = new events.EventEmitter();// 创建事件处理程序var connectHandler = function connected() { console.log('连接成功。'); // 触发 data_received 事件 eventEmitter.emit('data_received');}// 绑定 connection 事件处理程序eventEmitter.on('connection', connectHandler); // 使用匿名函数绑定 data_received 事件eventEmitter.on('data_received', function(){ console.log('数据接收成功。');});// 触发 connection 事件 eventEmitter.emit('connection');console.log("程序执行完毕。");
- Node.js Buffer(缓冲区),定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区,Node.js 目前支持的字符编码包括:ascii ,utf8,utf16le ,ucs2 ,base64 ,latin1 ,binary ,hex。
const buf = new Buffer('zhangda', 'ascii');console.log(buf.toString('hex'));console.log(buf.toString('base64'));
- Node.js Stream(流) 从流中读取数据:
var fs = require("fs");var data = '';// 创建可读流var readerStream = fs.createReadStream('input.txt');// 设置编码为 utf8。readerStream.setEncoding('UTF8');// 处理流事件 --> data, end, and errorreaderStream.on('data', function(chunk) { data += chunk;});readerStream.on('end',function(){ console.log(data);});readerStream.on('error', function(err){ console.log(err.stack);});console.log("程序执行完毕");
写入流:
var fs = require("fs");var data = '菜鸟教程官网地址:www.runoob.com';// 创建一个可以写入的流,写入到文件 output.txt 中var writerStream = fs.createWriteStream('output.txt');// 使用 utf8 编码写入数据writerStream.write(data,'UTF8');// 标记文件末尾writerStream.end();// 处理流事件 --> data, end, and errorwriterStream.on('finish', function() { console.log("写入完成。");});writerStream.on('error', function(err){ console.log(err.stack);});console.log("程序执行完毕");
管道流(读取一个文件内容并将内容写入到另外一个文件中)
var fs = require("fs");// 创建一个可读流var readerStream = fs.createReadStream('input.txt');// 创建一个可写流var writerStream = fs.createWriteStream('output.txt');// 管道读写操作// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中readerStream.pipe(writerStream);console.log("程序执行完毕");
- Node.js模块系统,为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。引入hello.js如下:
var hello = require('./hello');hello.world();
hello.js如下:
exports.world = function() { console.log('Hello World');}
- Node.js GET/POST请求 获取get请求内容:
var http = require('http');var url = require('url');var util = require('util'); http.createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); res.end(util.inspect(url.parse(req.url, true)));}).listen(3000);
获取post请求内容:
var http = require('http');var querystring = require('querystring'); http.createServer(function(req, res){ // 定义了一个post变量,用于暂存请求体的信息 var post = ''; // 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中 req.on('data', function(chunk){ post += chunk; }); // 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。 req.on('end', function(){ post = querystring.parse(post); res.end(util.inspect(post)); });}).listen(3000);
- Node.js Web 模块,可以使用node.js搭建web服务器,运行入口js文件后,需要将html文件放在当前目录下,入口js文件如下:
var http = require('http');var fs = require('fs');var url = require('url'); // 创建服务器http.createServer( function (request, response) { // 解析请求,包括文件名 var pathname = url.parse(request.url).pathname; // 输出请求的文件名 console.log("Request for " + pathname + " received."); // 从文件系统中读取请求的文件内容 fs.readFile(pathname.substr(1), function (err, data) { if (err) { console.log(err); // HTTP 状态码: 404 : NOT FOUND // Content Type: text/plain response.writeHead(404, {'Content-Type': 'text/html'}); }else{ // HTTP 状态码: 200 : OK // Content Type: text/plain response.writeHead(200, {'Content-Type': 'text/html'}); // 响应文件内容 response.write(data.toString()); } // 发送响应数据 response.end(); }); }).listen(8080); // 控制台会输出以下信息console.log('Server running at http://127.0.0.1:8080/');