node.js是什么?

174 阅读6分钟

学习常用的命令行下的命令及按键

考虑到后面一段时间我们将会与这个小窗

命令及键盘按键

node 空格 某个js文件         // 调用 node 程序,运行某个js文件
​
clear  或者  cls            // 清空界面
​
ls/list/dir                      // 查看列表(list)
​
cd 目录名                   // 进入到目录中去
​
cd ..                      // 返回上一级目录
​
cd \                                       // 直接回到根目录
                   
Ctrl+C                     // 停止 Node 程序
​
输入部分文件名后按下 Tab 键  // 补全文件名 或 目录名, 多次tab会进行切换
​
↑ ↓ 上下箭头                // 切换历史输入

复制粘贴

在小黑窗中复制内容:选中内容,再点鼠标右键

把粘贴板中的内容复制到小黑窗: 点鼠标右键

nodejs中的模块分类

image.png

每个模块都是一个独立的文件。每个模块都可以完成特定的功能,我们需要时就去引入它们,并调用。

nodejs模块的分类:

  • 核心模块

    • 就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用啦。相当于学习js时使用的Array对象。
    • 源代码 github.com/nodejs/node…
  • 自定义模块

    • 程序员自己写的模块。相当于我们在学习js时的自定义函数
  • 第三方模块

    • 其他程序员写好的模块。nodejs生态提供了一个专门的工具npm来管理第三方模块,后面我们会专门讲到。
    • 相当于别人写好的函数或者库。例如我们前面学习的JQuery库,artTemplate等。

学习核心模块fs

目标:通过学习核心模块fs,掌握核心模块的基本使用方法

fs是file system的简写

文档

nodejs.cn/api/

api.nodejs.cn/

学会查 API,远远比会几个 API 更重要

理解核心模块

核心模块就是 Node 内置的模块,需要通过唯一的标识名称来进行获取。每一个核心模块基本上都是暴露了一个对象,里面包含一些方法供我们使用。一般在加载核心模块的时候,变量(或常量)的起名最好就和核心模块的标识名同名。

例如:const fs = require('fs')

const path = require('path') 
console.log(path)

fs模块

fs模块(fs是 FileSystem的简写)是Node.js用来进行文件操作的模块,它属于核心模块。你引入之后就可以直接使用了。

官方手册:nodejs.cn/api/fs.html

核心模块的使用步骤:

  1. 引入模块

    // 引入模块
    const fs = require('fs');
    // 可以使用var、let,但是建议使用const,因为我们不希望它被改变。
    // 名字不必大写成FS,一般也就叫fs这个名字。
    
  2. 调用api实现自己的要求

    fs.apiName()
    

fs模块中操作文件(或者文件夹)的方法,大多都提供了两种选择:

  • 同步版本的
  • 异步版本的

fs-readFile-异步格式

目标: 写代码去读出文件内容,并打印在屏幕上

格式

fs.readFile('文件路径'[,选项], function (err, data) {
  if (err) throw err;
  console.log(data);
});

说明:

  • 参数1:文件路径。 相对路径和绝对路径均可。

  • 参数2: 配置项,可选参数,可不写。主要用来配置字符集。一般可设置为'utf8',如果不设置该参数,文件内容会Buffer形式返回。

  • 参数3: 读取完成后触发的回调函数。这个回调函数在读完文件后自动被nodejs自动调用,并传入 err 和 data

    • 如读取成功,回调函数中的两个参数分别是:

      • err: null

      • data: 文件内容,如果不设置参数2,则返回二进制数据。可以使用 toString() 方法将二进制数据

        转为正常字符串

    • 如读取失败,回调函数中的两个参数分别是:

      • err: 错误对象
      • data: undefined

示例1:读文本内容

const fs = require("fs")
fs.readFile('文件路径',(err, data) => {
  if (err) throw err;
  console.log(data);
});

上面的data将会是一个Buffer对象类似于数组,它的元素为16进制的两位数,它表示读出来的内容在计算机中的二进制格式。它有一个toString()方法,可以用来把内容以UTF-8的格式转成字符串。

示例2:读文本内容-指定编码格式

const fs = require("fs")
fs.readFile('文件路径', "utf8", (err, data) => {
  if (err) throw err;
  console.log(data);
});

示例3:读入图片文件

确保你的目录下有图片

const fs = require("fs")
fs.readFile('./img/1.jpg',  (err, data) => {
  if (err) throw err;
  console.log(data);
});

并不是它所有的文件都应该转成字符串的

示例4:体会异步的效果

异步的

const fs = require("fs")
console.log(1)
fs.readFile('文件路径', "utf8", (err, data) => {
  if (err) throw err;
  console.log(data);
});
console.log(2)

并不是它所有的文件都应该转成字符串的

image.png

练习

  1. 读文件试一试

    • 不同类型的:.txt. , .js, .jpg, .avi(读一个很大电影)
    • 不写utf8,写utf8
    • 体会一下异步

fs-readFile-观察并处理错误

nodejs中的错误界面相比浏览器中的错误来说,并不友好。

如果读文件有错误

在node.js中遇到的错误之后,应该观察错误说明

ps. 能写代码的是高手;能解决问题才是大神

fs-readFile-同步格式

格式

const fs = require("fs")
let rs = fs.readFileSync('文件路径',"utf8");
console.log(rs)
  • api的名字后面有Sync(async是异步的,sync表示同步的)
  • 不是通过回调函数来获取值,而是像一个普通的函数调用一样,直接获取返回值

捕获同步格式中的错误对象

如果读成功,则会获取读出来的数据,如果失败了,则会中间后续所有的代码执行。

console.log(1)
let res = fs.readFileSync('errorPath.js')
console.log(res)
console.log(2)

解决方案:用try. catch 结构

try {
  const fs = require("fs")
    let rs = fs.readFileSync('文件路径',"utf8");
    console.log(rs)
} catch(err) {
  console.log(err)
}

fs-writeFile-文件覆盖写入

覆盖写入 writeFile

功能:向指定文件中写入字符串, 如果没有该文件则尝试创建该文件。它是覆盖写入:会把文件中的内容全部删除,再填入新的内容。

格式:

fs.writeFile(pathName, content, option, (err)=>{});
// 参数1: 要写入的文件路径 --- 相对路径和绝对路径均可,推荐使用绝对路径
// 参数2: 要写入文件的内容
// 参数3: 配置项,设置写入的字符集,默认utf-8
// 参数4: 写入完成后触发的回调函数,有一个参数 --- err (错误对象)

示例1: 写入.txt文件

const fs = require('fs')
fs.writeFile('./a.txt', 'hello world! \n 换一行', err => {
  if (err) {
    console.info(err)
    throw err
  }
})

示例2: 写入json

稍微把问题提升一下,问: 如何把数据写入文件中?

const fs = require('fs')
​
const data = [{name: '小王', age: 20}]
fs.writeFile('./a.txt', data, err => {
  if (err) {
    console.info(err)
    throw err
  }
})

上面的写法会出错: data不是一个字符串或者是Buffer

const fs = require('fs')
​
const data = [{name: '小王', age: 20}]
fs.writeFile('./a.txt', JSON.stringify(data), err => {
  if (err) {
    console.info(err)
    throw err
  }
})

作业

对json数据进行操作。

|--db
|-----data.json
|--yourfile.js

data.json

[{"name":"小王"},{"name":"小李"}]

yourfile.js

// 这里写你的代码
// ......
// 完成的功能是: node yourfile.js之后,会在data.json中添加一条记录:

会在data.json中添加一条记录

[{"name":"小王"},{"name":"小李"},{"name":"小张"}]

附:fs模块中的常用方法

API作用备注
fs.access(path, callback)判断路径是否存在
fs.appendFile(file, data, callback)向文件中追加内容
fs.copyFile(src, callback)复制文件
fs.mkdir(path, callback)创建目录
fs.readDir(path, callback)读取目录列表
fs.rename(oldPath, newPath, callback)重命名文件/目录
fs.rmdir(path, callback)删除目录只能删除空目录
fs.stat(path, callback)获取文件/目录信息
fs.unlink(path, callback)删除文件
fs.watch(filename[, options][, listener])监视文件/目录
fs.watchFile(filename[, options], listener)监视文件
fs.existsSync(absolutePath)判断路径是否存在

\