【Nodejs】文件读写服务器模块

本文介绍了Node.js作为JavaScript运行时环境,允许JavaScript脱离浏览器运行,并提供了文件系统(fs)模块进行文件读写操作。通过讲解如何创建最简单的HTTP服务器,阐述了如何改进并处理请求响应,特别是Content-type的重要性。此外,还讨论了require方法在模块化中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 Node.js

一个JavaScript是无处不在的。凡是能用JavaScript来实现的,最终都会用JavaScript来实现。

org(organization):一般技术网站的域名都是org,或者io。

  • Nodejs不是一门语言,也不是库。
  • 一个JavaScript运行时环境,它可以解析和执行JavaScript代码。换而言之,就是一个平台。
  • 以前只有浏览器可以解析执行JavaScript代码。
  • 也就是说现在的JavaScript可以完全脱离浏览器来运行,一切都归功于:Nodejs
  • 浏览器中的JavaScript
    • EcmaScript其中质包含基本的语法、if、var、function、Object、Array
    • BOM
    • DOM
    • 浏览器不能读取某个文件的内容
  • Nodejs 中的JavaScript。
    • 没有 BOM、DOM
    • 采用ECMaScript进行编码
    • 和浏览器中的javascript是不一样的
    • 在Node这个JavaScript执行环境中为JavaScript提供了一些服务器级别的操作API
      • 例如文件读写
      • 网络服务的构建
      • 网络通信
      • 解析执行JavaScript
      • http

2 文件操作:

2.1 读取文件:

浏览器中的js是没有问价操作的能力的,但是Node中的js具有文件读取的能力。

fs 是 file-system的简写,就是文件系统的意思。

在Node中如果想要进行文件操作,就必须引入fs这个核心模块。

在fs这个核心模块中,就提供了所有的文件操作相关的API

浏览器是不认识node代码的,可以将写好的文件引入html文件中,进行尝试

// 1.使用require方法加载fs核心模块
var fs = require('fs')

//2.读取文件
// 参数1为要读取的文件路径;参数2为一个回调函数
// 参数3为回调函数
// 成功: data 数据、error nul
// 失败: data  null、error 错误对象
fs.readFile('hello.txt',function(error,data){
	//文件中存储的其实都是二进制数据,也能够以16进制的形式表现出来,我们也可以通过toString转换成我们能认识的字符
	console.log(data.toString()
})

2.2 写文件:

var fs = require('fs') //导入核心块
// 参数1为文件路径;参数2为文件内容。
// 参数3为回调函数
//	 成功:文件写入成功,error 是 null
//	 失败:文件写入失败,error 是错误对象
fs.writeFile('night.md','大家好,我是nodejs',function(error){
    if(error){
        console.log("写入失败");
    }else{
        console.log("写入成功");//此时error为null,判断读文件是否成功,也可以用该判断方法。
    }
}) //写的都是文本文件

node也能完成目录创建与读取之类的操作。

3 创建服务器:

3.1 最简单的一个http服务:

// 可以使用Node构建一个web服务器
// 核心模块:http
// http : 用来创建服务器

// 1.加载http核心模块
var http = require('http');
// 2.使用http.createServer()方法创建一个web服务器
var server = http.createServer();
// 3. 服务器的几个常见功能:接收请求、发送响应、处理请求
// 注册request请求事件,当客户端请求过来,就会自动触发服务器的request请求事件,
//然后执行第二个参数:回调函数
server.on('request',function(){
    console.log('疏导客户端的请求了');
})
// 4. 绑定端口号,启动服务器
server.listen(3000,function(){
    console.log('服务器启动成功了,可以通过http://localhost:3000/来进行访问');
})
//服务器启动后,被访问的时候会打印服务器启动成功文字,但是不会给网页请求返回内容

3.2 改进:

var http = require('http');
var server = http.createServer();
// 回调函数需要接收两个参数,即request、response
// request,请求对象可以用来获取客户端的一些请求信息,例如请求路径
// response,响应对象可以用来给客户端发送响应消息。
server.on('request',function(request,response){
    console.log('收到客户端的请求了,请求路径是:'+request.url);
    //request.url获取的是端口号后的路径
    // response对象由一个方法:write可以用来给客户端发送响应数据,write可以使用多次,但是最后一定要使用end来结束响应,否则客户端会一直等待!!!
    // write里写html标签、字符串、二进制能被识别,但是数字、数组、对象、布尔值是无法识别的。
    if(request.url == '/index'){
        response.write('首页');
    }else if(request.url == '/login'){
        response.write('登陆');
    }else if(request.url =='/haha'){
        response.write('hahah');
    }else{
        response.write('出错了');
    }
    response.end();//出现了这个语句,才会给客户端返回数据
})
// 4. 绑定端口号,启动服务器
server.listen(3000,function(){
    console.log('服务器启动成功了,可以通过http://localhost:3000/来进行访问');
})

response.end():可以直接将响应内容放入end()中,在实际的书写中,这种方式更实用。例如:response.end("首页")

request.url():获取到的是端口号之后的那一部分路径,换而言之,就是端口号后----“/”+…。所有请求路径都是以“/”开头的。

favicon.ico:这个是浏览器的默认行为,它会自动请求 收藏夹图标 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VK1dxh6e-1609429523022)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201206113503406.png)]

4 模块使用操作:

Node为JavaScript提供了很多服务器级别的API,这些API绝大多数都被包装到了一个具名的核心模块中,例如文件模块fs核心模块,http服务构建的http模块,path路径操作模块,os操作系统信息模块。在使用核心模块之前,必须先使用require方法记载才能使用。

4.1 require方法:

  • 作用:
    • 它可以用来加载模块,参数为具名模块名或者自定义模块的相对路径,其中相对路径的“./”不能省略,否则会报错。
    • 要加载文件模块导出的接口对象
      • 在每个文件模块中都提供了一个对象:exports(导出主要用它)。它默认是一个空对象。
      • 当要加载的文件含exports接口时,可以通过require这个模块得到。

==在node中,没有全局作用域,只有模块作用域。外部访问不到内部,内部也访问不到外部,即不同文件可以模块化在一个文件中执行,但是不能修改当前文件的数据及变量。==模块作用域固然带肋了一些好处,可以加载执行多个文件,可以完成避免变量名冲突污染的情况。但是在某些情况下,模块 与模块是需要进行通信的。此时,我们就需要用exports

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEMD7LiV-1609429523027)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201206153107442.png)]

关于端口号,ip地址用来定位计算机,端口号用来定位具体的应用程序。所有需要联网通信的应用程序都会占一个端口号。端口号的范围从:0-65535之间。可以同时开启多个服务,但一定要确保不同的服务占用不同的端口号才可以。换而言之,同一个为端口号同一时间只能被一个程序占用。

5 服务器响应:

5.1 Content-type

  • 不同的资源对应的Content-type值是不一样的。
  • 图片是不需要指定编码的。一般只为字符数据才指定编码。

服务器端默认发送的数据,其实是utf8(国际通用编码格式)编码的内容。但是浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码(一般操作系统使用的是gbk,中文编码)去解析。

image-20201209173655779

res.setHeader('Content-Type','text/plain;charset = utf-8')

上面这句代码的意思是接收的是普通文本,编码的方式是utf-8,这个设置可以避免乱码

  • Content-Type(内容的类型)。**在http协议中,Content-Type就是用来告知对方所发送的数据内容是什么类型。**这个设置的决定了服务端发送响应被解析的类型。
    • text/plain:普通文本
    • text/html:网页
    • … … …
    • http://tool.oschina.net/ 可以查询常用的HTTP Mime-type
image-20201209195503772

5.2 fs与请求相结合:

资源文件夹如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vubfD36k-1609429523030)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201209200631484.png)]

var http = require('http');
var fs = require('fs');
var server = http.createServer();
server.on('request',function(req,res){
    var url = req.url;
    if(url === '/'){
        fs.readFile('../resource/index.html',function(err,data){
            if(err){
                res.setHeader('Content-Type','text/plain;charset = utf-8');
                //本质上来讲发送的是文件的内容,而不是文件。
                res.end('文件读取失败,请稍后重试!');
            }else{
                // data 默认是二进制数据,可以通过 .toString 转为字符串
                // res.end() 支持两种类型的数据,一种是二进制,一种是字符串
                res.setHeader('Content-Type','text/html;charset = utf-8');
                res.end(data);
            }
        })
    }else if(url === '/a'){
        // url:统一资源定位符。一个url最终其实是要对应到一个资源的
        fs.readFile('../resource/face.jpg',function(err,data){
            if(err){
                res.setHeader('Content-Type','text/plain;charset = utf-8');
                res.end('文件读取失败,请稍后重试!');
            }else{
                // 图片不需要指定编码,我们常提到的编码都是指字符编码
                res.setHeader('Content-Type','image/jpeg');
                res.end(data);
            }
        })
    }
})
server.listen(3000,function(){
    console.log("server is running...");
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值