Node.js阶段学习笔记 2.0

global模块-全局变量

JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。

在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。

在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。

常用的global属性

console: 用于打印日志
setTimeout/clearTimeout: 设置清除延时器
setInterval/clearInterval: 设置清除定时器
 
__dirname: 当前文件的路径,不包括文件名
__filename: 获取当前文件的路径,包括文件名

//与模块化相关的,模块化的时候会用到
require	  除了global 全局模块, 其他node自己独有的模块需要require引入才能使用
exports
module

fs模块 (文件系统)

sync: 同步

async: 异步

fs模块是nodejs中最常用的一个模块,因此掌握fs模块非常的有必要,fs模块的方法非常多,用到了哪个查哪个即可。

文档地址:http://nodejs.cn/api/fs.html

在nodejs中,提供了fs模块,这是node的核心模块

注意:

  1. 除了global模块中的内容可以直接使用,其他模块都是需要加载的。
  2. fs模块不是全局的,不能直接使用。因此需要导入才能使用。
var fs = require("fs");

读取文件

语法:fs.readFile(path[, options], callback)

方式一:不传编码参数

//参数1: 文件的名字
//参数2: 读取文件的回调函数
  //参数1:错误对象,如果读取失败,err会包含错误信息,如果读取成功,err是null
  //参数2:读取成功后的数据(是一个Buffer对象)
fs.readFile("data.txt", function(err, data){
  console.log(err);
  console.log(data);
});

方式二:传编码参数

//参数1: 文件的路径
//参数2: 编码,如果设置了,返回一个字符串,如果没有设置,会返回一个buffer对象
//参数3: 回调函数
fs.readFile("data.txt", "utf8",function(err, data){
  console.log(err);
  console.log(data);
});

err错误信息: ENOENT	(没有实体文件)  
E:error  no ENT: 实体(文件/文件夹)

关于Buffer对象

1. Buffer对象是Nodejs用于处理二进制数据的。
2. 其实任意的数据在计算机底层都是二进制数据,因为计算机只认识二进制。
3. 所以读取任意的文件,返回的结果都是二进制数据,即Buffer对象
4. Buffer对象可以调用toString()方法转换成字符串。

写文件

语法:fs.writeFile(file, data[, options], callback)

//参数1:写入的文件名(如果文件不存在,会自动创建)
//参数2:写入的文件内容(注意:写入的内容会覆盖以前的内容)
//参数3:写文件后的回调函数
fs.writeFile("2.txt", "hello world, 我是一个中国人", function(err){
  if(err) {
    return console.log("写入文件失败", err);
  }
  console.log("写入文件成功");
});

注意:

  1. 写文件的时候,会把原来的内容给覆盖掉

追加文件

语法:fs.appendFile(path, data[, options], callback)

//参数1:追加的文件名(如果文件不存在,会自动创建)
//参数2:追加的文件内容(注意:写入的内容会覆盖以前的内容)
//参数3:追加文件后的回调函数
fs.appendFile("2.txt", "我是追加的内容", function(err){
  if(err) {
    return console.log("追加文件内容失败");
  }
  console.log("追加文件内容成功");
})

思考:如果没有appendFile,通过readFile与writeFile应该怎么实现?

先读取文件, 利用data = data + ‘内容’

然后文件写入的时候,第二参数填data

文件同步与异步的说明

fs中所有的文件操作,都提供了异步和同步两种方式

异步方式:不会阻塞代码的执行

//异步方式
var fs = require("fs");

console.log(111);
fs.readFile("2.txt", "utf8", function(err, data){
  if(err) {
    return console.log("读取文件失败", err);
  }
  console.log(data);
});
console.log("222");

异步代码会放到最后执行,不管前面有多少代码,都要等他们执行完才执行异步代码

同步方式:会阻塞代码的执行

//同步方式
console.log(111);
var result = fs.readFileSync("2.txt", "utf-8");
console.log(result);
console.log(222);

总结:同步操作使用虽然简单,但是会影响性能,因此尽量使用异步方法,尤其是在工作过程中。

其他api(了解)

方法有很多,但是用起来都非常的简单,学会查文档

文档:http://nodejs.cn/api/fs.html

方法名描述
fs.readFile(path, callback)读取文件内容(异步)
fs.readFileSync(path)读取文件内容(同步)
fs.writeFile(path, data, callback)写入文件内容(异步)
fs.writeFileSync(path, data)写入文件内容(同步)
fs.appendFile(path, data, callback)追加文件内容(异步)
fs.appendFileSync(path, data)追加文件内容(同步)
fs.rename(oldPath, newPath, callback)重命名文件(异步)
fs.renameSync(oldPath, newPath)重命名文件(同步)
fs.unlink(path, callback)删除文件(异步)
fs.unlinkSync(path)删除文件(同步)
fs.mkdir(path, mode, callback)创建文件夹(异步)
fs.mkdirSync(path, mode)创建文件夹(同步)
fs.rmdir(path, callback)删除文件夹(异步)
fs.rmdirSync(path)删除文件夹(同步)
fs.readdir(path, option, callback)读取文件夹内容(异步)
fs.readdirSync(path, option)读取文件夹内容(同步)
fs.stat(path, callback)查看文件状态(异步)
fs.statSync(path)查看文件状态(同步)

path模块

路径操作的问题

在读写文件的时候,文件路径可以写相对路径或者绝对路径

//data.txt是相对路径,读取当前目录下的data.txt, 相对路径相对的是指向node命令的路径
//如果node命令不是在当前目录下执行就会报错, 在当前执行node命令的目录下查找data.txt,找不到
fs.readFile("data.txt", "utf8", function(err, data) {
  if(err) {
    console.log("读取文件失败", err);
  }

  console.log(data);
});

相对路径:相对于执行node命令的路径

绝对路径:__dirname: 当前文件的目录,__filename: 当前文件的目录,包含文件名

path模块的常用方法

path.join();//拼接路径
// 好處
const path2 = path.join(__dirname,'data.txt')   ok
const path2 = path.join(__dirname,'/data.txt')  ok
const path2 = path.join(__dirname,'./data.txt') ok

【优化读写文件的代码】

path模块其他api(了解)

方法名描述
path.basename(path[, ext])返回文件的最后一部分
path.dirname(path)返回路径的目录名
path.extname(path)获取路径的扩展名
path.isAbsolute(path)判断目录是否是绝对路径
path.join([...paths])将所有的path片段拼接成一个规范的路径
path.normalize(path)规范化路径
path.parse(path)将一个路径解析成一个path对象
path.format(pathObj)讲一个path对象解析成一个规范的路径

http模块

创建服务器基本步骤

//1. 导入http模块,http模块是node的核心模块,作用是用来创建http服务器的。
var http = require("http");

//2. 创建服务器
var server = http.createServer();

//3. 服务器处理请求
server.on("request", function() {
  console.log("我接收到请求了");
});

//4. 启动服务器,监听某个端口
server.listen(9999, function(){
  console.log("服务器启动成功了, 请访问: http://localhost:9999");
});

//错误码
EADDRINUSE: error addr(地址,端口) in use (正在使用)

详细说明

  1. 给服务器注册request事件,只要服务器接收到了客户端的请求,就会触发request事件
  2. request事件有两个参数,request表示请求对象,可以获取所有与请求相关的信息,response是响应对象,可以获取所有与响应相关的信息。
  3. 服务器监听的端口范围为:1-65535之间,推荐使用3000以上的端口,因为3000以下的端口一般留给系统使用

request对象详解

文档地址:http://nodejs.cn/api/http.html ==> 【http.IncomingMessage 类

常见属性:

headers: 所有的请求头信息
method: 请求的方式
rawHeaders: 所有的请求头信息(数组的方式)
url: 请求的地址	(很重要)

注意:在发送请求的时候,可能会出现两次请求的情况,这是因为谷歌浏览器会自动增加一个favicon.ico的请求。

**小结:**request对象中,常用的就是method和url两个参数

response对象详解

文档地址:http://nodejs.cn/api/http.html ==> 【http.ServerResponse 类

常见的属性和方法:

res.write(data): 给浏览器发送请求体,可以调用多次,从而提供连续的请求体
res.end();   通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为已完成。
res.end(data); 结束请求,并且响应一段内容,相当于res.write(data) + res.end()

res.statusCode: 响应的的状态码 200 404 500
res.statusMessage: 响应的状态信息, OK Not Found ,会根据statusCode自动设置。

res.setHeader(name, value); 设置响应头信息, 
比如content-type,'text/plain;charset=utf8'

res.writeHead(statusCode(字符串), statusMessage, options); 设置响应头,同时可以设置状态码和状态信息。

注意:必须先设置响应头,才能设置响应。

根据不同请求输出不同响应数据

  • request.url
  • req.url:获取请求路径
    • 例如:请求http://127.0.0.1:3000/index 获取到的是:/index
    • 例如:请求http://127.0.0.1:3000/ 获取到的是:/
    • 例如:请求http://127.0.0.1:3000 获取到的是:/

服务器响应文件

  • 注意:浏览器中输入的URL地址,仅仅是一个标识,不与服务器中的目录一致。也就是说:返回什么内容是由服务端的逻辑决定
server.on('request', function(req, res) {
  var url = req.url
  if(url === '/') {
    fs.readFile('./index.html', function(err, data) {
      if(err) {
        return res.end('您访问的资源不存在~')
      }

      res.end(data)
    })
  }
})

模拟Apache服务器

  • 根据 req.url 读取不同的页面内容,返回给浏览器
  • 读取文件中, path.join(__dirname,’./xxx’,req.url) 这样就不用 if 判断了
  • 命令行在 文件夹中 输入 http-server

MIME类型

  • MIME(Multipurpose Internet Mail Extensions)多用途Internet邮件扩展类型 是一种表示文档性质和格式的标准化方式
  • 浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档;因此服务器将正确的MIME类型附加到响应对象的头部是非常重要的
  • MIME 类型

mime模块

  • 作用:获取文件的MIME类型
  • 安装:npm i mime
var mime = require('mime')

// 获取路径对应的MIME类型
mime.getType('txt')                    // ⇨ 'text/plain'
// 根据MIME获取到文件后缀名
mime.getExtension('text/plain')        // ⇨ 'txt' 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值