Node.js,服务端的JavaScript。node.js就是一个前端觉得写个功能还要等后端捣鼓半天,然后干脆就自己用javascript把后端搞定的一个东西。
- 安装
官网下载合适的包安装:https://nodejs.org/en/
代码安装(推荐,比较方便)
brew install node
安装完node之后检查电脑是否安装node
通过cd,返回到最根目录,然后如下操作
node -v
mac电脑
- 第一个Node.js应用:“Hello World”
打开编辑器(我习惯vscode),创建一个helloworld.js文件,单独放一行代码就行,如下图所示:
保存该文件,并通过Node.js来执行(我将文件保存到了桌面,所以执行时,需要先cd到桌面,再执行):
node helloworld.js
在终端输出Hello World
- 创建 Node.js 应用
将下列代码粘贴到创建的helloworld.js文件,helloworld.js文件可以直接在熟悉的代码编辑器上面编辑(例如vscode)
//使用require指令来载入http模块,并将实例化的HTTP赋值给变量http
var http=require("http");
//使用 http.createServer() 方法创建服务器
http.createServer(function (request,response){//发送HTTP头部//HTTP状态值: 200:ok//内容类型: text/plainresponse.writeHead(200,{"Content-Type":"text/plain"});//发送响应数据"Hello World\n"response.end("Hello World\n");
//使用 listen 方法绑定 88 端口
}).listen(88);
//终端打印信息如下:
console.log("Server running at http://127.0.0.1:88/");
然后在终端输入
node helloworld.js
打开浏览器访问 http://127.0.0.1:88/,你会看到一个写着 "Hello World"的网页。
- 小工具supervisor
Node.js修改代码后,只有重新运行才能看到变化。supervisor可以监视用户对代码的改动,自动重启Node.js
npm install -g supervisor//mac或linux需要授权
sudo npm install -g supervisor
之前是通过node helloworld.js运行helloworld.js,安装这个工具后,通过如下代码启动
supervisor helloworld.js
- Node.js 回调函数
桌面新建文件夹node_study,文件夹内新建文件test.js、input.txt
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 EventEmitter
//引入events模块
var events = require("events");
//创建eventEmitter对象
var eventEmitter = new events.EventEmitter();
//创建事件处理程序
var connectHandler = function connected() {console.log("连接成功");//触发data_received事件eventEmitter.emit("data_received")
}
//绑定connection事件处理程序
//on(event, listener)
//为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
eventEmitter.on("connection", connectHandler)
//使用匿名函数绑定data_received事件
eventEmitter.on("data_received", function () {console.log("数据接收成功")
});
eventEmitter.emit("connection");
// once(event, listener)
// 为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
eventEmitter.once('connection', function (stream) {console.log('Ah, we have our first user!');
});
// 监听器 #1
var listener1 = function listener1() {console.log('监听器 listener1 执行。');
}
// 监听器 #2
var listener2 = function listener2() {console.log('监听器 listener2 执行。');
}
// 绑定 connection 事件,处理函数为 listener1
// addListener(event, listener)
// 为指定事件添加一个监听器到监听器数组的尾部。
eventEmitter.addListener('connection', listener1);
// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);
var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");
// 处理 connection 事件
// emit(event, [arg1], [arg2], [...])
// 按监听器的顺序执行执行每个监听器,如果事件有注册监听返回 true,否则返回 false。
eventEmitter.emit('connection');
// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");
// 触发连接事件
eventEmitter.emit('connection');
eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + " 个监听器监听连接事件。");
console.log("程序执行完毕");
- 创建及加载模块
1.使用exports创建
文件test.js
var name;
exports.setName = function(thyName){name = thyName;
};
exports.sayHello = function(){console.log("Hello "+name)
}
文件getmoudle.js
var myMoudle1 = require("./test");
myMoudle1.setName("Alisa");
var myMoudle2 = require("./test");
myMoudle2.setName("Alisa2");
myMoudle1.sayHello();//Hello Alisa2
//变量myMoudle1和myMoudle2指向的都是同一个实例,因此,myMoudle1.setName的结果被myMoudle2.setName覆盖,最终输出结果是由后者决定的
2.覆盖exports
文件test.js
function Hello(){var name;this.setName = function(thyName){name = thyName;};this.sayHello = function(){console.log("Hello "+ name);}
}
module.exports = Hello;
//使用module.exports = Hello代替了exports.Hello = Hello
文件getmoudle.js
var Hello = require("./test");
hello = new Hello();
hello.setName("Alisa");
hello.sayHello();