node基础学习

发布时间:2024-05-05 14:01

node学习链接Node.js 简介

node基础学习_第1张图片

1、node退出码

1

2

3

console.log(111)

process.exit(0)         // 默认情况下,退出码为 0,表示成功

console.log(222)        // 不执行

2、node终止

 1 const express = require('express')
 2 const app = express()
 3 
 4 app.get('/', (req, res) => {
 5   res.send("hello world")
 6 })
 7 
 8 app.listen(3000, ()=> {
 9   console.log('启动')
10 })
11 
12 process.on('SIGABRT', () => {
13   console.log(11111)
14   server.close(() => {
15     console.log('进程已终止')
16   })
17 })
18 
19 setTimeout(()=> {
20   process.kill(process.pid, 'SIGTERM')        // 杀死进程
21 }, 3000)

3、处理运行参数

 1 // 运行命令 node demo1.js name=a
 2 
 3 // argv 属性,该属性是一个包含所有命令行调用参数的数组。
 4 // 第一个参数是 node 命令的完整路径。
 5 // 第二个参数是正被执行的文件的完整路径。
 6 // 所有其他的参数从第三个位置开始。
 7 process.argv.forEach((val, index) => {
 8   console.log(`${index}: ${val}`)
 9 })
10 
11 /*
12 0: D:\node\node.exe
13 1: D:\code\node\demo1.js
14 2: name=a
15 */
16 
17 // 也可以通过创建一个排除了前两个参数的新数组来仅获取其他的参数:
18 const args = process.argv.slice(2)
19 console.log(args)  // [ 'name=a' ]
20 
21 // 使用 minimist 库处理参数 
22 // node demo1.js -a hh -b dd
23 const args = require('minimist')(process.argv.slice(2))
24 console.log(args)   // { _: [], a: 'hh', b: 'dd' }

1 const minimist = require('minimist')
2 console.log(process.argv)   // [ 'D:\\node\\node.exe', 'D:\\code\\node\\demo03', '--name=a' ]
3 const args = minimist(process.argv.slice(2))
4 console.log(args)     // { _: [], name: 'a' }
5 console.log(args['name'])   // a

4、控制台输出

 1 // 通过传入变量和格式说明符来格式化用语
 2 console.log('%s已经%d岁了', "小明", '5')    // 小明已经5岁了
 3 /*
 4 ** %s 会格式化变量为字符串
 5 ** %d 会格式化变量为数字
 6 ** %i 会格式化变量为其整数部分
 7 ** %o 会格式化变量为对象
 8 */
 9 
10 // console.clear()   // 清除控制台
11 
12 
13 // 元素计数: count 方法会对打印的字符串的次数进行计数,并在其旁边打印计数
14 const x = 5
15 const y = 2
16 console.count(x)    // 5: 1
17 console.count(x)    // 5: 2
18 console.count("aaa",x)    // aaa: 1
19 console.count("aaa",x)    // aaa: 2
20 console.count("aaaaa",x)  // aaaaa: 1
21 
22 
23 
24 // console.trace() 打印堆栈踪迹
25 fn1 = () => console.trace()
26 fn2 = () => fn1()
27 fn2()
28 
29 /*
30 ** at fn1 (D:\code\node\demo1.js:25:21)
31 ** at fn2 (D:\code\node\demo1.js:26:13)
32 ** at Object. (D:\code\node\demo1.js:27:1)
33 ** at Module._compile (internal/modules/cjs/loader.js:1072:14)
34 ** at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
35 ** at Module.load (internal/modules/cjs/loader.js:937:32)
36 ** at Function.Module._load (internal/modules/cjs/loader.js:778:12)
37 ** at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
38 ** at internal/main/run_main_module.js:17:47
39 */
40 
41 // 可以使用 time() 和 timeEnd() 轻松地计算函数运行所需的时间:
42 const doSomething = () => console.log('测试')
43 const measureDoingSomething = () => {
44   console.time('doSomething()')
45   //做点事,并测量所需的时间。
46   doSomething()
47   console.timeEnd('doSomething()')
48 }
49 measureDoingSomething() 
50 // 测试 
51 // doSomething(): 0.602ms
52 
53 // Progress ,可在控制台中创建进度条。 使用 npm install progress 进行安装。
54 const ProgressBar = require('progress')
55 const bar = new ProgressBar(':bar', { total: 10 })
56 const timer = setInterval(() => {
57   bar.tick()
58   if (bar.complete) {
59     clearInterval(timer)
60   }
61 }, 100)

从命令行接受输入

 1 const readline = require('readline').createInterface({
 2   input: process.stdin,
 3   output: process.stdout
 4 })
 5 
 6 readline.question(`你叫什么名字?`, name => {
 7   console.log(`你好 ${name}!`)
 8   readline.close()
 9 })
10 
11 /*
12 这段代码会询问用户名,当输入了文本并且用户按下回车键时,则会发送问候语。
13 question() 方法会显示第一个参数(即问题),并等待用户的输入。 当按下回车键时,则它会调用回调函数。
14 */
15 
16 // Inquirer.js 软件包则提供了更完整、更抽象的解决方案。
17 var questions = [
18   {
19     type: 'input',
20     name: 'name',
21     message: "你叫什么名字?"
22   }
23 ]
24 
25 inquirer.prompt(questions).then(answers => {
26   console.log(`你好 ${answers['name']}!`)
27 })

5、process.nextTick()

当将一个函数传给 process.nextTick() 时,则指示引擎在当前操作结束(在下一个事件循环滴答开始之前)时调用此函数

6、setImmediate()

当要异步地(但要尽可能快)执行某些代码时,其中一个选择是使用 Node.js 提供的 setImmediate() 函数

7、文件描述符

 1 const fs = require('fs')
 2 
 3 // 文件描述符是使用 fs 模块提供的 open() 方法打开文件后返回的
 4 fs.open('./a.txt', 'r', (err, fd) => {
 5   console.log(fd)   // 3
 6 })
 7 //fd 是文件描述符  
 8 
 9 // 该标志意味着打开文件用于读取
10 // r+ 打开文件用于读写。
11 // w+ 打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
12 // a 打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
13 // a+ 打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件

8、文件属性

 1 const fs = require('fs')
 2 fs.stat('./a.txt', (err, stats) => {
 3   // 文件信息属性
 4   // console.log(stats)
 5   // 使用 stats.isFile() 和 stats.isDirectory() 判断文件是否目录或文件。
 6   // 使用 stats.isSymbolicLink() 判断文件是否符号链接。
 7   // 使用 stats.size 获取文件的大小(以字节为单位)。
 8   console.log(stats.isFile())       // true
 9   console.log(stats.isDirectory())  // false
10   console.log(stats.isDirectory())  // false
11   console.log(stats.size)           // 4
12 })

9、文件路径

 1 const path = require('path')
 2 
 3 const note = '/a.txt'
 4 
 5 // dirname: 获取文件的父文件夹
 6 // basename: 获取文件名部分
 7 // extname: 获取文件的扩展名
 8 console.log(path.dirname(note))   //  /
 9 console.log(path.basename(note))  // a.txt
10 console.log(path.extname(note))   // .txt
11 
12 // 使用 path.join() 连接路径的两个或多个片段
13 const name = 'joe'
14 path.join('/', 'users', name, 'notes.txt')  // '/users/joe/notes.txt'
15 
16 // 可以使用 path.resolve() 获得相对路径的绝对路径计算
17 console.log(path.resolve('a.txt'))    // D:\code\node\a.txt
18 
19 // 如果指定第二个文件夹参数,则 resolve 会使用第一个作为第二个的基础
20 // path.resolve('tmp', 'joe.txt') //'/Users/joe/tmp/joe.txt' 如果从主文件夹运行。
21 
22 // 如果第一个参数以斜杠开头,则表示它是绝对路径
23 // path.resolve('/etc', 'joe.txt') //'/etc/joe.txt'
24 
25 // path.normalize() 是另一个有用的函数,当包含诸如 .、.. 或双斜杠之类的相对说明符时,其会尝试计算实际的路径:
26 // path.normalize('/users/joe/..//test.txt') //'/users/test.txt'

10、文件读写

 1 const fs = require('fs')
 2 
 3 // 文件读取
 4 fs.readFile('./a.txt', 'utf-8', (err, data) => {
 5   if(err) {
 6     console.log(err)
 7     return
 8   }
 9   console.log(data)
10 })
11 
12 // 文件写入
13 // 默认情况下,此 API 会替换文件的内容(如果文件已经存在)
14 const content = "2222"
15 fs.writeFile('./a.txt', content, err => {
16   if(err) {
17     console.log(err)
18     return
19   }
20 })
21 
22 // 可以通过指定标志来修改默认的行为
23 const addContent = '3333'
24 fs.writeFile('./a.txt', addContent, { flag: 'a+'}, err => {
25   if(err) {
26     console.log(err)
27     return
28   }
29 })
30 // r+ 打开文件用于读写。
31 // w+ 打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
32 // a 打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
33 // a+ 打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
34 
35 // 将内容追加到文件末尾
36 const addContentAgain = "4444"
37 fs.appendFile('./a.txt',addContentAgain, err => {
38   if(err) {
39     console.log(err)
40     return
41   }
42 })

11、文件夹操作

 1 const fs = require('fs')
 2 const path = require('path')
 3 const fsExtra = require('fs-extra')
 4 
 5 const foldername = './test'
 6 console.log(fs.existsSync(foldername))    // true 检查文件夹是否存在
 7 
 8 const newFolder = './testNew'
 9 fs.mkdirSync(newFolder)       // 创建文件夹
10 
11 // 使用 fs.readdir() 或 fs.readdirSync() 可以读取目录的内容, 返回相对路径
12 console.log(fs.readdirSync(foldername))  // [ 'aa.txt', 'bb.html', 'cc.js' ]
13 
14 // 获得完整路径
15 var pathList = fs.readdirSync(foldername).map(fileName => {
16   return path.join(foldername, fileName)
17 })
18 console.log(pathList) // [ 'test\\aa.txt', 'test\\bb.html', 'test\\cc.js' ]
19 
20 // 使用 fs.rename() 或 fs.renameSync() 可以重命名文件夹
21 fs.rename(newFolder, './test_new', err => {
22   if(err) {
23     console.log(err)
24     return
25   }
26 })
27 
28 // 使用 fs.rmdir() 或 fs.rmdirSync() 可以删除文件夹。
29 // 最好安装 fs-extra 模块,它是 fs 模块的直接替代品
30 fsExtra.remove('./test_new', err => {
31   if(err) {
32     console.log(err)
33     return
34   }
35 })

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号