node.js

node.js学习(一)

一、fs文件系统模块

fs.readFile() 读取指定文件中的内容

fs.writeFile() 向指定文件写入内容

使用这个模块需要提前导入 const fs = require(‘fs’)

1、fs.readFile() 读取指定文件中的内容

fs.readFile( path , [options], callback)

options 表示用什么样的格式读取文件

const fs = require('fs')//引入模块
fs.readFile('./1.js', 'utf-8', function (err,dataStr) {
  console.log(err);//null
  console.log("-------");
  console.log(dataStr);//文件中的内容
})

image-20210730153129226

//如果读取成功,则err的值为null
//如果读取失败,则err的值为错误对象,dataStr 的值为undefined

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

2、判断是否读取成功

const fs = require('fs')
fs.readFile('./11.txt', 'utf-8', function (err,dataStr) {
  // console.log(err);
  // console.log("-------");
  // console.log(dataStr);
  if(err){
    return console.log('读取文失败!'+err);
  }
  console.log('读取文件成功!');
})

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

3、fs.writeFile() 向指定文件写入内容

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

data是必选参数,表示要写入文件的内容

const fs = require('fs')
fs.writeFile('./1.txt','456', 'utf-8', function (err) {
  console.log(err);
  if(err){
    return console.log('写入文失败!'+err);
  }
  console.log('写入文件成功!');
})
//如果文件写入成功,err就是null
//如果文件写入失败,err就是一个真正的错误对象

注意:这里的文件写入他是覆盖原内容写入。。。

如果你想一个未创建的文件写入内容时,是先创建文件,再写入

const fs = require('fs')
fs.readFile(__dirname+'./1.txt', 'utf-8', function (err, dataStr) {
  if(err){
    return  console.log(err);
  }
  // console.log('文件读取成功!'+dataStr);
  const arr = dataStr.split(' ')
  const arr1 = []
  arr.forEach(item=>{
    arr1.push(item.replace('=',': '))
  })
  const str = arr1.join('\r\n')
  fs.writeFile('./2.txt',str, 'utf-8',function (err) {
    if(err){
      return  console.log(err);
    }
    console.log('文件写入成功!');
  })
})

为了防止node动态拼接路径产生错误,可以将文件的相对地址改成绝对地址,但是这样移植性差,不好维护。

__dirname 表示当前文件的目录

二、path路径模块

path.join() 将多个路径片段拼接成一个完整的路径字符串

path.basename() 从路径字符串中将文件名解析出来

先导入这个模块 const path = require(‘path’)

1、path.join() 将多个路径片段拼接成一个完整的路径字符串

path.join([…path])

const pathStr = path.join('/a', '/b/c', '../','./d', 'e')
console. log(pathStr) //输出\a\b\d\e	其中../会抵消一个路径片段
const pathStr2 = path.join(_ dirname, './files/1.txt')
console. log(pathStr2) // 输出当前文件所处目录\files\1.txt

以后所有的路径拼接都不要用+了

2、path.basename() 从路径字符串中将文件名解析出来

path.basename(path, [ext]) ext指的是文件拓展名

const fpath = '/a/b/c/index.html' //文件的存放路径
var fullName = path.basename(fpath)
console.log(fullName) //输出index.html
var nameWi thoutExt = path. basename(fpath,'.html' )
console.log(nameWithoutExt) //输出index

3、path.extname(path) 从路径中获取文件扩展名

const fpath = '/a/b/c/index.html'
var extname = path.extname(fpath)
console.log(extname) //.html

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

三、HTTPweb服务器模块

http模块是Node.js官方提供的、用来创建web服务器的模块。通过http模块提供的http.createServer0方法,就
能方便的把一台普通的电脑,变成一台Web服务器,从而对外提供Web资源服务。

先导入const http = require(‘http’),在使用http.createServer()

服务器和普通电脑的区别是web服务器软件,就像IIS或者apache

1.创建web服务器的基本步骤

①导入http模块. const http = require(‘http’)
②创建web服务器实例 const server = http.createServer()
③为服务器实例绑定request事件,监听客户端的请求 server.on(‘request’, (req,res) =>{
console.log(‘有人访问了!’)
})//只要有人访问我们的服务器,就会触发这个事件,调用回调函数
④启动服务器 server.listen(80, ()=>{
console.log(‘开始了’)
})

const http = require('http')
const server = http.createServer()
server.on('request', (req,res) =>{
  console.log('有人访问我的服务器');
  res.end('there are some data for customer')
})
server.listen(8080, () =>{
  console.log('开始运行服务器了');
})
//req是请求对象,包含了与客户端相关的数据和属性
// req.rul是客户端请求的URL地址
// req.method是客户端请求的method方法

// res是响应对象,包含的服务器向客户端响应的数据,并结束这次响应,调用res.end()方法响应内容

当返回数据时,中文会出现乱码,解决方法如下:

需要设置一个响应头,content-type的值时text/html; charset=utf-8

 res.setHeader('Content-Type', 'text/html; charset=utf-8')
const http = require('http')const server = http.createServer()server.on('request', (req,res) =>{  console.log('有人访问我的服务器');  res.setHeader('Content-Type', 'text/html; charset=utf-8')  res.end('there are some data for customer,这次好了')  })server.listen(8080, () =>{  console.log('开始运行服务器了');})

根据不同URL响应不同的HTML内容

server.on('request', function(req, res){	const url = req.url// 1.获取请求的url 地址	let content = '<h1>404 Not found!</h1>' // 2.设置默认的内容为404 Not found	if (url === '/'|| url === '/index.html'){		content = '<h1>首页</h1>'// 3.用户请求的是首页	}else if (url === '/about.html'){		content = '<h1>关于页面</h1>'// 4.用户请求的是关于页面	}	res.setHeader( 'Content-Type','text/html; charset=utf-8') // 5.设置Content-Type 响应头,防止中文乱码	res.end(content)// 6.把内容发送给客户端})

四、模块化

就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。

模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则。
例如:
●使用什么样的语法格式来引用模块
●在模块中使用什么样的语法格式向外暴露成员

1、分类

内置模块 fs,path,http

自定义模块 我们创建的每一个js文件

第三方模块 第三方的,需要下载使用

// 1.加载内置的fs模块const fs = require( 'fs' )// 2.加载用户的自定义模块	文件的相对路径const custom = require('./custom.js')// 3.加载第三方模块(关于第三方模块的下载和使用,会在后面的课程中进行专]的讲解)const moment = require('moment')

使用require加载自定义的模块时可以省略文件拓展名

2、模块作用域

类似函数的作用域,好处是防止了全局变量污染问题

3、向外共享模块中的成员

3.1、module对象

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

module.exports对象可以将模块成员共享出去,require()获得的对象就是这个exports的对象

// console.log(module);const age = 20module.exports = {  name: 'zs',  say: function () {    console.log('hello');  }}module.exports.age = age//向对象上挂载一个属性

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

使用require0方法导入模块时,导入的结果,永远以module.exports指向的对象为准。就是最后指向的对象,如下图所示

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

3.2、exports 对象

和module。exports一样的作用,只是这样写更见的方便,像下图中一样,就是我添加了不同的属性和方法,导致了两者的不同

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

使用误区:::永远谨记 永远以module.exports指向的对象为准

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

五、包

什么是包,通俗的说就是第三方模块 电脑=计算机

可以在 https://www.npmjs.com/下载相应的包,但是需要耐心用这个搜包,用https://registry.npmjs.org/下载包

安装包的命令 npm install 包名 或者 npm i 包名

node_ modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。
package-lock.json配置文件用来记录node_ modules 录下的每一个包的下载信息, 例如包的名字、版本号、下载地址等。
若安装指定版本的包 在包名后加上@ 版本号(点分十进制)

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

如何在项目中记录安装了那些包——创建一个package.json文件 --npm init -y(快速创建这个文件且只用一次)

上述命令智能在英文目录下创建,不能有中文和空格

一次性下载所有的包—— npm i 先读取节点中的饱和版本,再一次性下载

卸载包—— npm uninstall 包名

如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。要使用 npm i -D(具体可以在项目文档中找)
与之对应的,如果某些包在开发和项目上线之J后都需要用到,则建议把这些包记录到dependencies节点中。

解决下包速度慢——淘宝NPM镜像服务器——npm config get registry(检查下包源),

npm config set registry=https://registry.npm.taobao.org/ 切换下包的地址

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

上一篇:2021.07.29 stream 流 【拿来吧你 node】


下一篇:HTML公告