【Node.js】 基础语法

Node.js

Node.js 就是运行在服务端的 JavaScript。
参考资料:

npm

① 修改NPM的缓存目录,配置环境变量

//set 配置转移
npm config set prefix “F:\nodejs\node_global”   
npm config set cache “F:\nodejs\node_cache” 
//get 获取查看  
npm config get prefix
npm config get cache

node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

② npm install
参考资料:
npm install express -g或npm install express报错之解决方案
最新chalk5.0.0不支持在nodejs中require()导入,解决方法

③ cnpm 淘宝镜像:npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行脚本

其他错误:
无法将“XXX”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

package.json

npm 使用介绍
属性:
name - 包名。
version - 包的版本号。
description - 包的描述。
homepage - 包的官网 url 。
author - 包的作者姓名。
contributors - 包的其他贡献者姓名。
dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
main - main 字段指定了程序的主入口文件,require(‘moduleName’) 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
keywords - 关键字

字符编码

  • Node.js 目前支持的字符编码包括:
    • ascii 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
    • utf8 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
    • utf16le 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 +10FFFF)。
    • ucs2 utf16le 的别名。
    • base64 Base64 编码。
    • latin1 一种把 Buffer 编码成一字节编码的字符串的方式。
    • binary latin1 的别名。
    • hex 将每个字节编码为两个十六进制字符。

REPL

  • REPL 命令
    • ctrl + c - 退出当前终端。
    • ctrl + c 按下两次 - 退出 Node REPL。
    • ctrl + d - 退出 Node REPL.

Buffer(缓冲区)

参考资料:Node.js Buffer(缓冲区)

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
一个 Buffer 类似于一个整数数组

  • Buffer.alloc(size[, fill[, encoding]]): 返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0
  • Buffer.allocUnsafe(size): 返回一个指定大小的 Buffer 实例,但是它不会被初始化,所以它可能包含敏感的数据
  • Buffer.allocUnsafeSlow(size)
  • Buffer.from(array): 返回一个被 array 的值初始化的新的 Buffer 实例(传入的 array 的元素只能是数字,不然就会自动被 0 覆盖)
  • Buffer.from(arrayBuffer[, byteOffset[, length]]): 返回一个新建的与给定的 ArrayBuffer 共享同一内存的 Buffer。
  • Buffer.from(buffer): 复制传入的 Buffer 实例的数据,并返回一个新的 Buffer 实例,
    • const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
  • Buffer.from(string[, encoding]): 返回一个被 string 的值初始化的新的 Buffer 实例
  • Buffer.concat(list[, totalLength]) Node 缓冲区合并的语法
    • 参数:
      • list - 用于合并的 Buffer 对象数组列表。
      • totalLength - 指定合并后Buffer对象的总长度。
    • 返回值:返回一个多个成员合并的新 Buffer 对象。
    • 例:var buffer3 = Buffer.concat([buffer1,buffer2]);
  • buf.write(string[, offset[, length]][, encoding]) 写入 Node 缓冲区 ,buf是自己定义的变量
    • 参数:
      • string - 写入缓冲区的字符串
      • offset - 缓冲区开始写入的索引值,默认为 0
      • length - 写入的字节数,默认为 buffer.length
      • encoding - 使用的编码。默认为 ‘utf8’
    • 返回值:返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串
  • buf.toString([encoding[, start[, end]]]) 读取 Node 缓冲区数据,buf是自己定义的变量
    • 参数:
      • encoding - 使用的编码。默认为 ‘utf8’ 。
      • start - 指定开始读取的索引位置,默认为 0。
      • end - 结束位置,默认为缓冲区的末尾。
    • 返回值:解码缓冲区数据并使用指定的编码返回字符串。
buf = Buffer.alloc(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // 输出: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   //使用 'ascii' 编码, 并输出: abcde
console.log( buf.toString('utf8',0,5));    // 使用 'utf8' 编码, 并输出: abcde
console.log( buf.toString(undefined,0,5)); // 使用默认的 'utf8' 编码, 并输出: abcde
var buffer1 = Buffer.from(('菜鸟教程'));
var buffer2 = Buffer.from(('www.runoob.com'));
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log('buffer1=', buffer1.toString());   //输出 buffer1= 菜鸟教程
console.log('buffer2=', buffer2.toString());   //输出 buffer2= www.runoob.com
console.log("buffer3=" + buffer3.toString());  //输出 buffer3=菜鸟教程www.runoob.com
  • buf.toJSON() 将 Node Buffer 转换为 JSON 对象,buf是自己定义的变量
    • 当字符串化一个 Buffer 实例时,JSON.stringify() 会隐式地调用该 toJSON()。
    • 返回值:返回 JSON 对象。
//例子
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

// 输出: {"type":"Buffer","data":[1,2,3,4,5]}
console.log(json);

const copy = JSON.parse(json, (key, value) => {
  console.log('key=',key);
  console.log('value=',value);
  console.log('value.type=',value.type);
  console.log('value.data=',value.data);
  console.log('value && value.type === Buffer? ----- ',value && value.type === 'Buffer');  
  return value && value.type === 'Buffer' ?      //判断与运算是否正确
    Buffer.from(value.data) :                    //若对返回该值 <Buffer 01 02 03 04 05>
    //111111111 :                                //若对返回该值 111111111
    value;                                       //若错返回该值 
});

// 输出: <Buffer 01 02 03 04 05>
console.log(copy);
//结果
PS E:\learn> node demo23.js
{"type":"Buffer","data":[1,2,3,4,5]}
key= type
value= Buffer
value.type= undefined
value.data= undefined
value && value.type === Buffer? -----  false       //return Buffer
key= 0
value= 1
value.type= undefined
value.data= undefined
value && value.type === Buffer? -----  false       //return 1
key= 1
value= 2
value.type= undefined
value.data= undefined
value && value.type === Buffer? -----  false       //return 2
key= 2
value= 3
value.type= undefined
value.data= undefined
value && value.type === Buffer? -----  false       //return 3
key= 3
value= 4
value.type= undefined
value.data= undefined
value && value.type === Buffer? -----  false       //return 4
key= 4
value= 5
value.type= undefined
value.data= undefined
value && value.type === Buffer? -----  false       //return 5
key= data
value= [ 1, 2, 3, 4, 5 ]
value.type= undefined
value.data= undefined
value && value.type === Buffer? -----  false       //return [1, 2, 3, 4, 5]
key=
value= { type: 'Buffer', data: [ 1, 2, 3, 4, 5 ] }
value.type= Buffer
value.data= [ 1, 2, 3, 4, 5 ]
value && value.type === Buffer? -----  true        //return Buffer.from(value.data) 即<Buffer 01 02 03 04 05>
<Buffer 01 02 03 04 05>         //111111111 如果代码写的是这个,会返回这个
//虽然有很多return,但是有很多对key,value,后面的return会覆盖前面的,所以取最后一个
  • buf.compare(otherBuffer); Node Buffer 比较的函数
    • 参数:otherBuffer - 与 buf 对象比较的另外一个 Buffer 对象。
    • 返回值:返回一个数字,表示 buf 在 otherBuffer 之前,之后或相同
var buffer1 = Buffer.from('aBC');
var buffer2 = Buffer.from('CDE');
var result = buffer1.compare(buffer2);
console.log("result=", result);
if(result < 0) {
   console.log(buffer1 + " 在 " + buffer2 + "之前");
}else if(result == 0){
   console.log(buffer1 + " 与 " + buffer2 + "相同");
}else {
   console.log(buffer1 + " 在 " + buffer2 + "之后");
}

在这里插入图片描述

  • buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]) Node 缓冲区拷贝
    • 参数:
      • targetBuffer - 要拷贝的 Buffer 对象。
      • targetStart - 数字, 可选, 默认: 0
      • sourceStart - 数字, 可选, 默认: 0
      • sourceEnd - 数字, 可选, 默认: buffer.length
    • 返回值:没有返回值
    • 例:buf2.copy(buf1, 2);
  • buf.slice([start[, end]]) Node 缓冲区裁剪
    • 参数:
      • start - 数字, 可选, 默认: 0
      • end - 数字, 可选, 默认: buffer.length
    • 返回值:返回一个新的缓冲区,它和旧缓冲区指向同一块内存,但是从索引 start 到 end 的位置剪切。
//例子
var buffer1 = Buffer.from('runoob');
// 剪切缓冲区
var buffer2 = buffer1.slice(2,5);  //r=0,u=1,n=2,o=3,o=4,b=5,\0=6, 从2到5,,2计入,5不计入
console.log("buffer2 content: " + buffer2.toString());
//结果
buffer2 content: noo
  • buf.length; Node 缓冲区长度
    • 返回值:返回 Buffer 对象所占据的内存长度。
    • 返回这个 buffer 的 bytes 数。注意这未必是 buffer 里面内容的大小。length 是 buffer 对象所分配的内存数,它不会随着这个 buffer 对象内容的改变而改变。

其他未列出的 buf. ··· 的函数参考Node.js Buffer(缓冲区)最后的表格

函数

参考资料:Node.js 函数

//一个函数可以作为另一个函数的参数
function say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");

//可以直接在另一个函数的括号中定义和传递这个函数,不一定要"先定义,再传递",不用起名,所以叫匿名函数
function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");
回调函数

参考资料:Node.js 回调函数

例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。

回调函数一般作为函数的最后一个参数出现:
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }

模块系统

Node.js 模块

Express 框架

参考资料:Node.js Express 框架

全局对象

参考资料:Node.js 全局对象

全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量
在浏览器 JavaScript 中,通常 window 是全局对象,
Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。

全局变量:

  • __filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
  • __dirname 表示当前执行脚本所在的目录
PS E:\learn> node demo22.js   //console.log( __filename );
E:\learn\demo22.js
PS E:\learn> node demo22.js   //console.log( __dirname );
E:\learn

全局函数:

  • setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。setTimeout() 只执行一次指定函数。返回一个代表定时器的句柄值。
  • clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
  • setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。返回一个代表定时器的句柄值。可以使用 clearInterval(t) 函数来清除定时器。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
console

js技巧 console.log使用

  • console.log([data][, ...]) 向标准输出流打印字符并以换行符结束。该方法接收若干 个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则 以类似于C 语言 printf() 命令的格式输出。
  • console.info([data][, ...]) 该命令的作用是返回信息性消息,这个命令与console.log差别并不大,除了在chrome中只会输出文字外,其余的会显示一个蓝色的惊叹号。
  • console.error([data][, ...]) 输出错误消息的。控制台在出现错误时会显示是红色的叉子。
  • console.warn([data][, ...]) 输出警告消息。控制台出现有黄色的惊叹号。
  • console.dir(obj[, options]) 用来对一个对象进行检查(inspect),并以易于阅读和打印的格式显示。
  • console.time(label)输出时间,表示计时开始。
  • console.timeEnd(label) 结束时间,表示计时结束。
  • console.trace(message[, ...]) 当前执行的代码在堆栈中的调用路径,这个测试函数运行很有帮助,只要给想测试的函数里面加入 console.trace 就行了。
  • console.assert(value[, message][, ...]) 用于判断某个表达式或变量是否为真,接收两个参数,第一个参数是表达式,第二个参数是字符串。只有当第一个参数为false,才会输出第二个参数,否则不会有任何结果。
process

process 是一个全局变量,即 global 对象的属性。

事件

  • exit 当进程准备退出时触发。
  • beforeExit 当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 ‘beforeExit’ 的监听器可以异步调用,这样 node 就会继续执行。
  • uncaughtException 当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。
  • Signal 事件 当进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等
//demo26.js
process.on('exit', function(code) {

  // 以下代码永远不会执行
  setTimeout(function() {     // 为什么setTimeout()的内容不会被输出?
    console.log("该代码不会执行");   
  }, 0);
  
  console.log('退出码为:', code);   //因为没有给code赋值,所以输出0
});
console.log("程序执行结束");

//结果
$ node demo26.js
程序执行结束
退出码为: 0

退出状态码

  • Uncaught Fatal Exception 有未捕获异常,并且没有被域或 uncaughtException 处理函数处理。
  • Unused 保留,由 Bash 预留用于内置误用
  • Internal JavaScript Parse Error JavaScript的源码启动 Node 进程时引起解析错误。非常罕见,仅会在开发 Node 时才会有。
  • Internal JavaScript Evaluation Failure JavaScript 的源码启动 Node 进程,评估时返回函数失败。非常罕见,仅会在开发 Node 时才会有。
  • Fatal Error V8 里致命的不可恢复的错误。通常会打印到 stderr ,内容为: FATAL ERROR
  • Non-function Internal Exception Handler 未捕获异常,内部异常处理函数不知为何设置为on-function,并且不能被调用。
  • Internal Exception Handler Run-Time Failure 未捕获的异常, 并且异常处理函数处理时自己抛出了异常。例如,如果 process.on(‘uncaughtException’) 或 domain.on(‘error’) 抛出了异常。
  • Unused 保留,在以前版本的 Node.js 中,退出码 8 有时表示未捕获的异常。
  • Invalid Argument 可能是给了未知的参数,或者给的参数没有值。
  • Internal JavaScript Run-Time Failure JavaScript的源码启动 Node 进程时抛出错误,非常罕见,仅会在开发 Node 时才会有。
  • Invalid Debug Argument 设置了参数–debug 和/或 --debug-brk,但是选择了错误端口。
  • Signal Exits 如果 Node 接收到致命信号,比如SIGKILL 或 SIGHUP,那么退出代码就是128 加信号代码。这是标准的 Unix 做法,退出信号代码放在高位。

属性

  • stdout 标准输出流。
  • stderr 标准错误流。
  • stdin 标准输入流。
  • argv argv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是node,第二个成员是脚本文件名,其余成员是脚本文件的参数。
  • execPath 返回执行当前脚本的 Node 二进制文件的绝对路径。
  • execArgv 返回一个数组,成员是命令行下执行脚本时,在Node可执行文件与脚本文件之间的命令行参数。
  • env 返回一个对象,成员为当前 shell 的环境变量
  • exitCode 进程退出时的代码,如果进程优通过 process.exit() 退出,不需要指定退出码。
  • version Node 的版本,比如v0.10.18。
  • versions 一个属性,包含了 node 的版本和依赖.
  • config 一个包含用来编译当前 node 执行文件的 javascript 配置选项的对象。它与运行 ./configure 脚本生成的 “config.gypi” 文件相同。
  • pid 当前进程的进程号。
  • title 进程名,默认值为"node",可以自定义该值。
  • arch 当前 CPU 的架构:‘arm’、‘ia32’ 或者 ‘x64’。
  • platform 运行程序所在的平台系统 ‘darwin’, ‘freebsd’, ‘linux’, ‘sunos’ 或 ‘win32’
  • mainModule require.main 的备选方法。不同点,如果主模块在运行时改变,require.main可能会继续返回老的模块。可以认为,这两者引用了同一个模块。

方法

  • abort() 这将导致 node 触发 abort 事件。会让 node 退出并生成一个核心文件。
  • chdir(directory) 改变当前工作进程的目录,如果操作失败抛出异常。
  • cwd() 返回当前进程的工作目录
  • exit([code]) 使用指定的 code 结束进程。如果忽略,将会使用 code 0。
  • getgid() 获取进程的群组标识(参见 getgid(2))。获取到得时群组的数字 id,而不是名字。注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
  • setgid(id) 设置进程的群组标识(参见 setgid(2))。可以接收数字 ID 或者群组名。如果指定了群组名,会阻塞等待解析为数字 ID 。注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
  • getuid() 获取进程的用户标识(参见 getuid(2))。这是数字的用户 id,不是用户名。注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
  • setuid(id) 设置进程的用户标识(参见setuid(2))。接收数字 ID或字符串名字。果指定了群组名,会阻塞等待解析为数字 ID 。注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
  • getgroups() 返回进程的群组 iD 数组。POSIX 系统没有保证一定有,但是 node.js 保证有。注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
  • setgroups(groups) 设置进程的群组 ID。这是授权操作,所以你需要有 root 权限,或者有 CAP_SETGID 能力。注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
  • initgroups(user, extra_group) 读取 /etc/group ,并初始化群组访问列表,使用成员所在的所有群组。这是授权操作,所以你需要有 root 权限,或者有 CAP_SETGID 能力。注意:这个函数仅在 POSIX 平台上可用(例如,非Windows 和 Android)。
  • kill(pid[, signal]) 发送信号给进程. pid 是进程id,并且 signal 是发送的信号的字符串描述。信号名是字符串,比如 ‘SIGINT’ 或 ‘SIGHUP’。如果忽略,信号会是 ‘SIGTERM’。
  • memoryUsage() 返回一个对象,描述了 Node 进程所用的内存状况,单位为字节。
  • nextTick(callback) 一旦当前事件循环结束,调用回调函数。
  • umask([mask]) 设置或读取进程文件的掩码。子进程从父进程继承掩码。如果mask 参数有效,返回旧的掩码。否则,返回当前掩码。
  • uptime() 返回 Node 已经运行的秒数。
  • hrtime() 返回当前进程的高分辨时间,形式为 [seconds, nanoseconds]数组。它是相对于过去的任意事件。该值与日期无关,因此不受时钟漂移的影响。主要用途是可以通过精确的时间间隔,来衡量程序的性能。你可以将之前的结果传递给当前的 process.hrtime() ,会返回两者间的时间差,用来基准和测量时间间隔。

Stream(流)

参考资料:Node.js Stream(流)

  • Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)
  • Node.js,Stream 有四种流类型:
    • Readable - 可读操作
    • Writable - 可写操作
    • Duplex - 可读可写操作
    • Transform - 操作被写入数据,然后读出结果
  • 所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
    • data - 当有数据可读时触发。
    • end - 没有更多的数据可读时触发。
    • error - 在接收和写入过程中发生错误时触发。
    • finish - 所有数据已被写入到底层系统时触发。

未完待续
Node.js 创建第一个应用
Node.js 回调函数
Node.js Stream(流)
Node.js 路由
Node,js 全局对象 process后面的几个代码
Node.js 常用工具 unit 的几个函数再看下
Node.js GET/POST请求
Node.js Web 模块
Node.js Express 框架
Node.js RESTful API
Node.js 多进程
Node.js JXcore 打包
Node.js MySQL
Node,js MongoDB

Question:
①process中的 demo26.js 为什么setTimeout()的内容不会被输出?
②到底谁可以.on .write

//EventEmitter
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
    console.log('some_event 事件触发'); 
}); 

//process
process.on('exit', function(code) {
  console.log('退出码为:', code);
});
//Buffer
buf = Buffer.alloc(256);
len = buf.write("www.runoob.com");

//process.stdout
process.stdout.write("Hello World!" + "\n");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值