0%

NodeJS

居安思危,思则有备,有备无患。 —— 《左传·襄公十一年》

NodeJS和JS

一、概念

      JavaScript是一门动态脚本语言,可以运行于宿主环境(如浏览器等包含Js引擎的环境)。浏览器通过内置一个Js引擎可以解释执行Js代码,浏览器实现Js标准规范(ECMAScript),提供API(DOM和BOM),可以使用JavaScript调用,支持操作页面DOM,调用某些浏览器操作等客户端功能,可以说JavaScript = ECMAScript + DOM + 宿主环境(BOM)

      Node.js是一个基于Google V8引擎(Js引擎的某一种)构建的JavaScript运行环境,提供API(操作系统、文件系统、网络系统、数据库等),可以使用JavaScript调用,支持读取本地文件,开启本地主机端口服务,发送/接受请求等服务端功能,可以说Node.js = JavaScript + Node环境

要执行JavaScript代码必须要有一个Js引擎,而浏览器和Nodejs环境都内置了Js引擎。所以如果Js代码中调用了浏览器提供的API,则必须安装一个浏览器;若调用了Nodejs提供的API,则必须安装nodejs环境,然后以各自规定的方式加载、执行JavaScript代码。

前端JS是基于浏览器端的JavaScript,Node.js则一个是基于服务端的javascript(后端NodeJs)。

二、对比

  1. JavaScript是一门编程语言(脚本语言),而Node.js是一个运行环境。
  2. JavaScript以前是在浏览器里执行的,需要浏览器里的JavaScript引擎,Firefox有叫做Spidermonkey的引擎,Safari有JavaScriptCore的引擎,Chrome有V8的引擎,现在有人把Chrome有V8的引擎的引擎拿出来做了包装,加入了内置基本模块(大多用JavaScript编写),就构成了Node.js。
  3. Node.js可以说是JavaScript的一种独立于浏览器的运行环境。
  4. 两者侧重点也不太一样:
    • JavaScript
      • DOM(一些操作页面元素的方法)
      • BOM(一些操作浏览器的方法)
    • Node.js
      • OS(操作系统)
      • file(文件系统)
      • net(网络系统)
      • database(数据库)

三、参考

  1. Nodejs
  2. JavaScript
  3. 参考三

修改npm镜像

一、概念

  1. 定义:npm全称为Node Package Manager,是一个基于Node.js的包管理器,也是整个Node.js社区最流行、支持的第三方模块最多的包管理器,它的初衷是为了让JavaScript开发人员更容易分享和重用代码。

  2. 常见使用场景:

    • 获取第三方包并使用。
    • 将自己编写的包发布。
  3. 常用命令

    • 安装npm install [<name><version>][-g]/[--save][-dev]
    • 卸载npm uninstall [<name><version>][-g]/[--save][-dev]
    • 更新npm update [<name><version>][-g]/[--save][-dev]
    • 搜索npm search [<name><version>][-g]/[--save][-dev]
    • 查看安装模块npm list/ls/la/ll [-g]
    • 查看模块路径npm root [-g]
    • 查看模块信息npm view <name> [package.json属性名称]
    • 查看官方文档npm docs <name>

二、修改镜像

  1. 常见镜像
  2. 使用
    • 临时使用npm --registry https://registry.npm.taobao.org install <name>
    • 持久使用
      • 配置源npm config set registry https://registry.npm.taobao.org
      • 查看源npm config get registrynpm info express
    • 通过cnpm使用
    • 安装cnpmnpm install -g cnpm --registry=https://registry.npm.taobao.org
    • 使用cnpm和使用npm命令一样,正常操作就行了

三、参考

  1. 参考一
  2. 参考二
  3. 参考三

Node运行机制

一、事件循环

      众所周知,JS从诞生之日起就是一门单线程的非阻塞的脚本语言。单线程是由其最初的用途来决定的——与浏览器交互,JS代码在执行的任何时候都只有一个主线程来处理所有的任务。非阻塞则是当代码需要进行一项异步任务的时候(如I/O事件,无法立刻返回结果,需要花一定时间才能返回),主线程会挂起(pending)这个任务,然后在异步任务返回结果的时候再根据一定规则去执行相应的回调。要实现非阻塞,就要说到我们的主角——事件循环。

      JavaScript引擎本身不实现事件循环机制,浏览器中的事件循环由浏览器实现的,NodeJS中事件循环主要是由底层Libuv库实现的。

二、I/O多路复用

  1. select
  2. poll
  3. epoll(kqueue/iocp)

三、参考

  1. Youtube演讲
  2. 演示小工具
  3. Firefox手册
  4. V8 JavaScript 引擎
  5. WebSocket

Mac下nvm安装使用

一、概念

      nvm是node版本管理工具,为了解决node各种版本存在不兼容现象,nvm是让你在同一台机器上安装和切换不同版本的node的工具。

二、安装使用

  1. 安装brew install nvm

    • curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
    • wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
  2. 配置,正常安装完后会有相应提示,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Please note that upstream has asked us to make explicit managing
nvm via Homebrew is unsupported by them and you should check any
1 export JMETER_HOME=/usr/local/apache-jmeter-5.3/bin
problems against the standard nvm install method prior to reporting.

You should create NVM's working directory if it doesn't exist:

mkdir ~/.nvm

Add the following to ~/.zshrc or your desired shell
configuration file:

export NVM_DIR="$HOME/.nvm"
[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh" # This loads nvm
[ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion

You can set $NVM_DIR to any location, but leaving it unchanged from
/usr/local/opt/nvm will destroy any nvm-installed Node installations
upon upgrade/reinstall.

Type `nvm help` for further information.
  1. source .bash_profile
  2. 查看nvm版本nvm --version
  3. 安装node指定版本nvm install 版本号
  4. 查看本地node的所有版本nvm list
  5. 切到指定node版本nvm use 版本号
  6. 卸载指定的node版本nvm uninstall 版本号
  7. 安装最新的node稳定版本nvm install --lts
  8. 查看node的所有的版本nvm ls-remote
  9. 使用node指定版本执行指定文件nvm exec 版本号 node 要执行的文件路径
  10. 设置默认版本的Node,每次启动终端都使用该版本的nodenvm alias default 版本号

三、参考

  1. 参考一

Node操作MongoDB

一、准备阶段

  1. 安装node
  2. 安装MongoDB

二、开始(Mac)

  1. 进入主目录cd ~

  2. 创建node项目目录mkdir node

  3. 安装依赖npm install mongodb

  4. 开撸

    • 创建文档
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/';

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true}, function (err, con) {
    if (err) {
    throw err;
    }
    var db = con.db("mydb");
    db.createCollection('student', function (err, res) {
    if (err) {
    throw err;
    }
    console.log("Create dbs and collections success !");
    con.close();
    });
    });
    • 插入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";
    MongoClient.connect(url, {useUnifiedTopology: true, useNewUrlParser: true}, function (err, con) {
    if (err) {
    console.log("Connect error");
    }
    var db = con.db('mydb');
    var obj = {"name" : "张三", "age" : 12};
    db.collection("student").insertOne(obj, function (err, res) {
    if (err) {
    console.log("InsertOne fail");
    }
    // console.log(res);
    console.log("InsertOne success");
    con.close();
    });
    var obj = [
    {"name" : "张三", "age" : 12},
    {"name" : "李四", "age" : 13},
    {"name" : "王五", "age" : 14},
    ];
    db.collection("student").insertMany(obj, function (err, res) {
    if (err) {
    console.log("InsertMany fail");
    }
    // console.log(res);
    console.log("InsertMany success");
    con.close();
    });
    })
    • 查询
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
    if (err) {
    console.log("Connect error");
    }
    var db = con.db("mydb");
    var filter = {"name":"张三"}; // 查询条件
    var fields = {age: 0}; // 过滤字段
    // db.collection("student").find(filter).project(fields).toArray(function (err, result) {
    db.collection("student").find(filter, {fields: {name: 1}}).toArray(function (err, result) {
    // db.collection("student").find(filter, {projection: {age:0}}).toArray(function (err, result) {
    // db.collection("student").find(filter, fields).toArray(function (err, result) { // 不起作用
    if (err) {
    throw err;
    }
    console.log(result);
    con.close();
    });
    });
    • 更新
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
    if (err) {
    console.log("Connect error");
    }
    var db = con.db("mydb");
    var filter = {"name":"张三"};
    var replace = {$set: {"name":"张五"}};
    db.collection("student").updateOne(filter, replace, function(err, res) {
    if (err) {
    throw err;
    }
    console.log("Update one success");
    con.close();
    });

    var filter = {"name":"张三"};
    var replace = {$set: {"name":"张五"}};
    db.collection("student").updateMany(filter, replace, function(err, res) {
    if (err) {
    throw err;
    }
    console.log("Update many success");
    con.close();
    });
    });


    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
    if (err) {
    throw err;
    }
    var db = con.db("mydb");
    var filter = {name: "李四"}; // 查询条件
    var replace = {$set: {name: "张三"}}; // 替换
    db.collection("student").replaceOne(filter, replace, function(err, res) {
    if (err) {
    throw err;
    }
    console.log(res.result.n + "条被替换");
    con.close();
    });
    });
    • 删除
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, function(err, con) {
    if (err) {
    throw err;
    }
    var db = con.db("mydb");
    var filter = {name: "张五" }; // 查询条件
    db.collection("student").deleteMany(filter, function (err, res) {
    if (err) {
    throw err;
    }
    console.log(res.result.n + " 条文档被删除");
    con.close();
    });
    });

    三、参考

    1. node package