nodejs学习分享
nodejs安装配置
官方下载地址:https://nodejs.org/en/download/
命令安装
1.下载源码
在官方地址中下载SourceCode
或者
wget http://nodejs.org/dist/v0.10.24/node-v0.10.24.tar.gz
或者
git clone https://github.com/nodejs/node.git
2.解压源码
tar zxvf node-v0.10.24.tar.gz
3.编译安装
cd node-v0.10.24
./configure --prefix=/usr/local/node/0.10.24
make
make install
4.配置环境变量
vim /etc/profile
export NODE_HOME=源码包路径
export PATH=$NODE_HOME/bin:$PATH
source /etc/profile
验证是否安装成功
使用命令node -v
npm使用介绍
npm是一个包管理工具,类似于Java中的Maven;npmr入门文档见:https://www.npmjs.com.cn/getting-started/what-is-npm/
使用淘宝NPM镜像
同步频率目前为10分钟一次
npm install -g cnpm --registry=https://registry.npm.taobao.org
使用命令
cnpm install [name]
升级npm
npm install npm -g
cnpm install npm -g
基础语法
REPL
Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
Node 自带了交互式解释器,可以执行以下任务:
- 读取:读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
执行:执行输入的数据结构
打印:输出结果
循环:循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
同步、异步请求
nodejs中的异步
nodejs中存在异步,但仅限于 I/O 和 Timer
var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
if (err) return console.error(err);
console.log(data.toString());
});
console.log("程序执行结束!");
回调与异步的区别
在 javascript 中使用回调函数可所谓登峰造极,基本上所有的异步函数都会要求有一个回调函数,以至于写 javascript 写多了,看到回调函数的接口,都以为是异步的调用。
但是真相是回调函数,只是javascript 用来解决异步函数调用如何处理返回值这个问题的方法,或这样来说:异步函数调用如何处理返回值这个问题上,在系统的设计方面而言,有很多办法,而 nodejs 选择了 javascript 的传统方案,用回调函数来解决这个问题。
异步必带一个回调,而回调不一定是异步
js中的异步同步实例
<script>
/**
* 计算两个日期的天数差
* @param sDate1
* @param sDate2
*/
function datedifference(sDate1, sDate2) {
var dateSpan,
iDays;
sDate1 = Date.parse(sDate1);
sDate2 = Date.parse(sDate2);
dateSpan = sDate2 - sDate1;
dateSpan = Math.abs(dateSpan);
iDays = Math.floor(dateSpan / (24 * 3600 * 1000));
return iDays
}
/**
*获取当前日期
*/
function getNowFormatDate() {
var date = new Date();
var seperator1 = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = year + seperator1 + month + seperator1 + strDate;
return currentdate;
}
/**
*休眠
*/
function sleep(numberMillis) {
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}
/**
* 计算年龄
* @param birthdate 出生日期
* @param callBack 回调
*/
function calculateAge(birthdate,callBack){
var diff = datedifference(getNowFormatDate(),birthdate);
diff = diff/365.25;
diff = parseInt(diff);
callBack(diff);
}
var callBack = function (age){
sleep(1000);
console.log('年龄是:'+age);
}
console.log('----1 开始----');
calculateAge('2000-10-10',callBack);
console.log('测试是否在年龄输出之前');
/**
* 异步计算年龄
* @param birthdate
* @param callBack
*/
function laztyCalculateAge(birthdate,callBack){
setTimeout(function(){
calculateAge(birthdate,callBack);
},0);
}
console.log('----2 开始----');
laztyCalculateAge('2000-10-10',callBack);
console.log('测试是否在年龄输出之前');
</script>
事件循环
V8引擎为nodejs提供了异步执行回调接口
- 在Node.js中有一个事件队列,每个任务都会放入事件队列中,都会留下处理结果的回调函数,事件循环线程处理事件队列中的任务,直到回调函数不再存在。
- 在无阻塞的情况下,作为一个带有回调的函数被放入事件队列中,事件循环线程中被提取并执行。
- 当执行过程中遇到I/O阻塞(读取文件、查询数据库、请求套接字、访问远程服务等)时,事件循环线程不会停下等待结果,转而继续执行队列中的下一个任务,不会在事件循环线程中执行。在函数执行时,Node.js在事件队列中放置回调函数,它的顺序根据函数的完成快慢决定。
![](https://www.eimg.top/images/2020/01/08/c259aed1087bcb3d1176203b7822e280.jpg)
// 引入 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("程序执行完毕。");
模块系统
直接引用其他js文件,并直接使用其中的方法
数据库连接
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123456',
database : 'chat'
});
connection.connect();
connection.query('SELECT * from student', function (error, results, fields) {
if (error) throw error;
console.log(results);
});
来源:CSDN
作者:ja_rome
链接:https://blog.csdn.net/jlh912008548/article/details/80793331