nodejs1day(nodejs下载运行,fs、path、http模块,简单构建Web服务器)

37 篇文章 0 订阅
3 篇文章 0 订阅

Node.js初识

估计学完node.js其实就可以开发出一个前后端完整的项目了

Node.js下载

nodejs官网下载
在这里插入图片描述
这边建议下载长期维护版,毕竟尝鲜版还估计还有漏洞。维护版够用。
安装流程跟安装普通软件一样,配置环境是安装过程自动配置的。

在这里插入图片描述
这边查看是否下载成功,打开终端,在终端输入命令 node –v 后,按下回车键,即可查看已安装的 Node.js 的版本号。

Node.js运行

  1. 在脚本文件夹中打开终端

在这里插入图片描述
在这里插入图片描述

  • 当然打开终端还可以通过cmd的方式(使用快捷键(Windows徽标键 + R)打开运行面板,输入 cmd 后直接回车,即可打开终端。),但是要cd 到脚本所在的路径。
  • 用vscode打开终端请添加图片描述

终端中的快捷键

在 Windows 的 powershell 或 cmd 终端中,我们可以通过如下快捷键,来提高终端的操作效率:

  • 使用 键,可以快速定位到上一次执行的命令
  • 使用 tab 键,能够快速补全路径
  • 使用 esc 键,能够快速清空当前已输入的命令
  • 输入 cls 命令,可以清空终端

某个nodejs的中文文档
https://www.nodeapp.cn/documentation.html

fs文件系统模块

fs.readFile() 的语法格式

在这里插入图片描述
参数解读:
参数1:必选参数,字符串,表示文件的路径。
参数2:可选参数,表示以什么编码格式来读取文件,默认值是 utf8
参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。

// 引入fs模块
const fs = require('fs')

fs.readFile('./files/11.txt', 'utf8', function(err, dataStr) {
  if (err) {
    return console.log('读取文件失败!' + err.message)
  }
  console.log('读取文件成功!' + dataStr)
})

fs.writeFile() 的语法格式

在这里插入图片描述
参数解读:
参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
参数2:必选参数,表示要写入的内容。
参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8
参数4:必选参数,文件写入完成后的回调函数。

fs.writeFile('./files/3.txt', 'ok123', function(err) {
  // 1 如果文件写入成功,则 err 的值等于 null
  // 2 如果文件写入失败,则 err 的值等于一个 错误对象
  // console.log(err)
  if (err) {
    return console.log('文件写入失败!' + err.message)
  }
  console.log('文件写入成功!')
})

path路径模块

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

在这里插入图片描述
注意:涉及到路径拼接的操作,都使用 path.join() 方法进行处理。不要直接使用 + 进行字符串的拼接。

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

在这里插入图片描述
在这里插入图片描述

path.extname() 方法,可以获取路径中的扩展名部分,语法格式如下

在这里插入图片描述
在这里插入图片描述
path:必选参数,表示一个路径的字符串
返回值: 返回得到的扩展名字符串

路径读写综合案例

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

// 其中\s匹配空白字符, \S匹配非空白字符,[\s\S]就是匹配任意字符
const regStyle=/<style>([\s\S]*)<\/style>/g       //不要用.*啊,因为.不匹配换行符\n
const regScript=/<script>([\s\S]*)<\/script>/g
fs.readFile(path.join(__dirname,'./index.html'),'utf-8',function(err,dataStr){
    if(err){
    return console.log('读取HTML失败'+err.message)
    }
resolveCssAndJs('style',dataStr)
resolveCssAndJs('script',dataStr)
resolveHTML(dataStr)
})

function resolveCssAndJs(type,htmlStr){
// 判断是css还是js 
        let content,fileType
        if(type=='style'){
            fileType='css'
            content=regStyle.exec(htmlStr)[0].replace(`<${type}>`,'').replace(`</${type}>`,'')
        }  
        else if(type=='script'){
            fileType='js'
            content=regScript.exec(htmlStr)[0].replace(`<${type}>`,'').replace(`</${type}>`,'')
        } 
        else{
           return  console.log("没有css和js")
        }
        if(content){
            // 同步判断clock目录是否存在
                    if (fs.existsSync(path.join(__dirname,'./clock'))) {
                    console.log('file already exists');
                    }
                    else{
                        // mkdir是异步执行的,mkdirSync是同步执行的。这里一定要同步,否则先执行下面的写入文件了。
                        // 可以发现有回调函数的都是异步执行的
                        fs.mkdirSync(path.join(__dirname,'./clock'));
                    }
                    // 写入文件
                    fs.writeFile(path.join(__dirname,`./clock/index.${fileType}`),content,'utf8',function(err,res){
                    if(err){
                        return console.log("写入失败"+err.message)
                    }
                    console.log("写入成功")
                    })
                }
        else{
            console.log(content)
        }
    
}
function resolveHTML(htmlStr){
let htmlCotent=htmlStr.replace(regStyle,`<link rel="stylesheet" href="./index.css">`).replace(regScript,`<script src="./index.js"></script>`)
    fs.writeFile(path.join(__dirname,'./clock/index.html'),htmlCotent,'utf8',err=>{
        if(err) throw err
        console.log('写入成功')
    })
}

http模块

// 新引入http模块
const http=require('http')
// 创建web服务器实例
const server=http.createServer()
// 为服务器实例绑定request事件,监听客户端的请求

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

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

实现 clock 时钟的 web 服务器

核心思路

把文件的实际存放路径,作为每个资源的请求 url 地址。
在这里插入图片描述

实现步骤

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

// 1.1 导入 http 模块
const http = require('http')
// 1.2 导入 fs 模块
const fs = require('fs')
// 1.3 导入 path 模块
const path = require('path')

// 2.1 创建 web 服务器
const server = http.createServer()
// 2.2 监听 web 服务器的 request 事件
server.on('request', (req, res) => {
  // 3.1 获取到客户端请求的 URL 地址
  //     /clock/index.html
  //     /clock/index.css
  //     /clock/index.js
  const url = req.url
  // 3.2 把请求的 URL 地址映射为具体文件的存放路径
  // const fpath = path.join(__dirname, url)
  // 5.1 预定义一个空白的文件存放路径
  let fpath = ''
  if (url === '/') {
    fpath = path.join(__dirname, './clock/index.html')
  } else {
    //     /index.html
    //     /index.css
    //     /index.js
    fpath = path.join(__dirname, '/clock', url)
  }

  // 4.1 根据“映射”过来的文件路径读取文件的内容
  fs.readFile(fpath, 'utf8', (err, dataStr) => {
    // 4.2 读取失败,向客户端响应固定的“错误消息”
    if (err) return res.end('404 Not found.')
    // 4.3 读取成功,将读取成功的内容,响应给客户端
    res.end(dataStr)
  })
})
// 2.3 启动服务器
server.listen(80, () => {
  console.log('server running at http://127.0.0.1')
})

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值