nodejs学习分享

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在事件队列中放置回调函数,它的顺序根据函数的完成快慢决定。

image

// 引入 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);
});

猜你喜欢

转载自blog.csdn.net/jlh912008548/article/details/80793331