Node.js 初学习

Node.js 初学习

本篇博客内容来自于黑马程序员 Node.js 教学视频^^

1、了解Node.js

Node.js 是一个基于Chrome V8引擎JavaScript运行环境

Node.js运行环境

Node.js 运行环境

注意:

  1. 浏览器是 JavaScript的前端运行环境
  2. Node.js是JavaScript的后端运行环境
  3. Node.js中无法调用DOM和BOM等浏览器内置API

Node.js的用途

Node.js的用途

Node.js 官方提供两种版本

  • LTS 长期稳定版
  • Current 新特性尝鲜版

2、fs 文件系统模块

fs 模块是 Node.js 官方提供的、用来操作文件的模块,提供了一系列的方法和属性,用于满足用户对文件的操作需求

读取文件内容 readFile()

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

// path: 字符串,表示文件的路径
// options: 读取文件的格式
// callback: 文件读取完成后,通过回调函数拿到读取的结果

// 导入 fs 模块,用于操作文件
const fs = require('fs')

// 读取成功,则 err 的值为 null
// 读取失败,则 err 的值为错误对象,dataStr 的值为undefined
fs.readFile('./111.txt', 'utf-8', (err, dataStr) => {
  //console.log(err)
  //console.log('------')
  //console.log(dataStr)
  
  if (err) {
    console.log('文件读取失败!' + err.message)
  }
  console.log('文件读取成功!' + dataStr)
})

写入文件内容 writeFile()

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

// file: 表示文件存放路径的字符串
// data: 表示要写入的内容
// options: 文件内容的格式,默认utf8
// callback: 写入完成后的回调函数

const fs = require('fs')

fs.writeFile('./files/222.txt', 'hijklmn', 'utf-8', err => {
  // 写入成功,则 err 为 null
  // 写入失败,则 err 为错误对象
  if (err) {
    console.log('文件写入失败!' + err)
  }
  console.log('文件写入成功!')
})

fs模块操作文件时,如果提供的操作路径是以 ./ 或 …/ 开头的相对路径时,很容易出现路径动态拼接错误问题

原因:代码运行时,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径

解决方案:

  • 使用完整路径
  • 使用 __dirname 补充路径

3、path 路径模块

path 模块是 Node.js 官方提供的、用来处理路径的模块,它提供了一系列的方法和属性,用来满足用户对路径的处理需求。

路径拼接 path.join()

path.join([...paths])

// ...paths <string> 路径片段的序列
// return <string>

const path = require('path')

// '../' 抵消掉前面的/c路径
const pathStr = path.join('/a', '/b/c', '../', '/d', '/e')
console.log(pathStr) // \a\b\d\e

const pathStr2 = path.join(__dirname, '/files/111.txt')
console.log(pathStr2) // 文件当前所处目录\files\111.txt

获取路径中的文件名 path.basename()

path.basename(path[, ext])

// path <string> 表示路径的字符串
// ext <string> 表示文件扩展名
// return <string> 返回路径中的最后一部分

const filePath = '/a/b/d/index.html'
const fullName = path.basename(filePath)
console.log(fullName)

// 移除文件扩展名
const nameWithoutExt = path.basename(filePath, '.html')
console.log(nameWithoutExt)

获取路径中的文件扩展名

path.basename(path[, ext])

// path <string> 表示路径的字符串
// return <string> 返回扩展名字符串

const filePath = '/a/b/d/index.html'
const fileExt = path.extname(filePath)
console.log(fileExt)

时钟案例

时钟案例

const fs = require('fs')
const path = require('path')

const regStyle = /<style>[\s\S]*<\/style>/
const regScript = /<script>[\s\S]*<\/script>/



fs.readFile(path.join(__dirname, './素材/index.html'), 'utf-8', (err, dataStr) => {
  if(err) {
    console.log('HTML文件读取失败!' + err)
  }
  resolveCSS(dataStr)
  resolveJS(dataStr)
  resolveHTML(dataStr)

})

function resolveCSS(data) {
  const oldCSS = regStyle.exec(data)
  const newCSS = oldCSS[0].replace('<style>', ' ').replace('</style>', ' ')
  fs.writeFile(path.join(__dirname, './clock/index.css'), newCSS, 'utf-8', err => {
    if(err) {
      console.log('CSS写入失败!' + err.message)
    }
  })
}

function resolveJS(data) {
  const oldJS = regScript.exec(data)
  const newJS = oldJS[0].replace('<script>', ' ').replace('</script>', ' ')
  fs.writeFile(path.join(__dirname, './clock/index.js'), newJS, 'utf-8', err => {
    if(err) {
      console.log('JS写入失败!' + err.message)
    }
  })
}

function resolveHTML(data) {
  const newHTML = data.replace(regStyle, '<link rel = "stylesheet" href = "./index.css" />')
                      .replace(regScript, '<script src = "./index.js"/>')
  fs.writeFile(path.join(__dirname, './clock/index.html'), newHTML, 'utf-8', err => {
    if(err) {
      console.log('HTML写入失败!' + err.message)
    }
  })

}

注意点:

  • fs.writeFile() 方法只能用来创建文件,不能用来创建路径
  • 重复调用 fs.writeFile() 写入同一个文件,新写入的内容会覆盖之前的旧内容

4、http 模块

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

web 服务器软件,如:IIS、Apache等

在 Node.js 中,不需要使用 IIS、Apache 等第三方 web 服务器软件,我们可以基于 Node.js 提供的 http 模块,手写服务器软件,从而对外提供 web 服务

服务器相关概念

IP地址
域名与域名服务器
在这里插入图片描述

创建 web 服务器的基本步骤:
  1. 导入 http 模块
  2. 创建 web 服务器实例
  3. 为服务器实例绑定 request 事件,监听客户端的请求
  4. 启动服务器
// 1、导入 http 模块
const http = require('http')

// 2、创建 web 服务器实例
const server = http.createServer()

// 3、为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', (req, res) => {
  console.log('Someone visit our web server.')
})

// 4、启动服务器
server.listen(8080, () => {
  console.log('server running at http://127.0.0.1:8080')
})
req 请求对象

只要服务器接收到了客户端的请求,就会调用通过 server.on() 为服务器绑定的 request 事件处理函数

const http = require('http')

const server = http.createServer()

server.on('request', req => {
  // req 是请求对象,包含了与客户端相关的数据和属性
  // req.url 是客户端请求的 url 地址
  // req.method 是客户端的 method 请求类型
  const url = req.url
  const method = req.method
  const str = `Your request url is ${url}, and request method is ${method}`
  console.log(str)
})

server.listen(80, () => {
  console.log('server running at http:127.0.0.1:80')
})
res 响应对象

在服务器的 request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下方式:

const http = require('http')

const server = http.createServer()

server.on('request', (req, res) => {
  const url = req.url
  const method = req.method
  const str = `Your request url is ${url}, and request method is ${method}`
  console.log(str)
  // 调用 res.end() 方法,向客户端发送指定的内容,并结束这次请求的处理过程
  res.end(str)
})

server.listen(80, () => {
  console.log('server running at http:127.0.0.1:80')
})

解决中文乱码问题时设置响应头的编码格式即可

  res.setHeader('Content-Type', 'text/html; charset=utf-8')
根据不同的 url 响应不同的 html 内容

实现步骤

  1. 获取请求的 url 地址
  2. 设置默认的响应内容为 404 Not found
  3. 判断用户请求是否为 / 和 /index.html 首页
  4. 判断用户请求是否为 /about.html 关于页面
  5. 设置 Content-Type 响应头,防止中文乱码
  6. 使用 res.end() 把内容响应给客户端
const http = require('http')

const server = http.createServer()

server.on('request', (req, res) => {
  let url = req.url
  let content = '<h1>404 Not Found</h1>'
  if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>'
  } else if (url === '/about.html') {
    content = '<h1>关于</h1>'
  }
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  res.end(content)
})

server.listen(80, () => {
  console.log('server running at http://127.0.0.1:80')
})
时钟的 web 服务器

核心思路

时钟案例web服务器

实现步骤

  1. 导入需要的模块
  2. 创建基本的 web 服务器
  3. 将资源的请求 url 地址映射为文件的存放路径
  4. 读取文件内容并响应给客户端
  5. 优化资源的请求路径
const fs = require('fs')
const path = require('path')
const http = require('http')

const server = http.createServer()

server.on('request', (req, res) => {
  const reqUrl = req.url
  let filePath = ''
  if (reqUrl === '/') {
    filePath = path.join(__dirname, './clock/index.html')
  } else {
    filePath = path.join(__dirname, '/clock', reqUrl)
  } 
  fs.readFile(filePath, 'utf-8', (err, dataStr) => {
    if (err) {
      res.end('404 Not Found.')
    }
    res.end(dataStr) 
  })
})

server.listen('80', () => {
  console.log('server running at http://127.0.0.1:80')
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值