创建node.js应用:
1. require 指令来载入node自带的 http 模块
2. 创建服务器http.createServer()
NPM包管理工具:允许用户从NPM服务器下载下载并安装别人编写的命令行程序到本地使用
例子:从npm中安装module 【express】,再用require调用
$ npm install express //用uninstall卸载
var express = require('express');
package.json 位于模块的目录下,用于定义包的属性。使用 npm init 创建
REPL(交互式解释器) 输入node进入,在shell中输入语句,即刻返回结果
node.js都具有回调的功能,非阻塞异步编程的实现
阻塞/非阻塞:阻塞是顺序执行一项项任务,非阻塞不需要顺序执行
同步/异步:异步就像一个提醒器,告诉我什么时候那个任务完成了。
非阻塞异步实例:(readFile与console.log同步执行)
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单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
事件驱动程序
// 引入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter(); // 创建事件处理程序 var connectHandler = function connected() { console.log('连接成功。'); // 触发 data_received 事件 ,emit是触发的意思 eventEmitter.emit('data_received'); } // 绑定 connection 事件处理程序,on是绑定的意思,connection 就是函数 connectHandler eventEmitter.on('connection', connectHandler); // 使用匿名函数绑定 data_received 事件 eventEmitter.on('data_received', function(){ console.log('数据接收成功。'); }); // 触发 connection 事件 eventEmitter.emit('connection'); console.log("程序执行完毕。");
events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
js中只用字符串类型,Node.js定义Buffer 类来创建一个专门存放二进制数据的缓存区。
const buf = Buffer.from('runoob', 'ascii'); // 把runoob转化为二进制 // 输出 72756e6f6f62 console.log(buf.toString('hex')); // 输出 cnVub29i console.log(buf.toString('base64'));
node.js 调用require(一个文件为一个模块)
var http = require("http");
在原生模块http中请求,并返回本地变量。
自带了一个叫做 http 的模块,我们在我们的代码中请求它并把返回值赋给一个本地变量。
两种方式:
1. exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。
var hello = require('./hello'); hello.world();
exports.world = function() { //hello文件里面的成员函数 console.log('Hello World'); }
2.把export直接作为一个函数,调用其中的子函数
function Hello() { var name; this.setName = function(thyName) { name = thyName; }; this.sayHello = function() { console.log('Hello ' + name); }; }; module.exports = Hello; //hello文件里面的
var Hello = require('./hello'); hello = new Hello(); hello.setName('BYVoid'); hello.sayHello();
__filename 表示当前正在执行的脚本的文件名
__dirname 表示当前执行脚本所在的目录。
setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。
var counter = 10; console.log("计数: %d", counter);
util ~~继承,转换字符
util.inherits(Sub, Base); //sub 继承base,只继承原型中定义的函数,而构造函数内部创造的 base 属 性和 sayHello 函数都没有被 Sub 继承
util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法,用于调试输出
文件系统
读取文件:异步的 fs.readFile() 和同步的 fs.readFileSync()。异步更好,非阻塞,性能更高,更快
打开文件:fs.open(path, flags[, mode], callback)
获取文件信息:fs.stat(path, callback)
写入文件:fs.writeFile(file, data[, options], callback)
读取文件:fs.read(fd, buffer, offset, length, position, callback)
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'});
// 解析 url 参数
var params = url.parse(req.url, true).query;
res.write("网站名:" + params.name);
res.write("\n");
res.write("网站 URL:" + params.url);
res.end();
}).listen(3000);
用post的方式请求
var http = require('http');
var querystring = require('querystring');
var postHTML =
'<html><head><meta charset="utf-8"><title>菜鸟教程 Node.js 实例</title></head>' +
'<body>' +
'<form method="post">' +
'网站名: <input name="name"><br>' +
'网站 URL: <input name="url"><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
http.createServer(function (req, res) {
var body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
// 解析参数
body = querystring.parse(body);
// 设置响应头部信息及编码
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
if(body.name && body.url) { // 输出提交的数据
res.write("网站名:" + body.name);
res.write("<br>");
res.write("网站 URL:" + body.url);
} else { // 输出表单
res.write(postHTML);
}
res.end();
});
}).listen(3000);
get/post 实例
http://www.runoob.com/nodejs/nodejs-express-framework.html
update 18.4.6 大概了解工作原理了,下次再补充