node

134 阅读10分钟

Node.js是一个应用编程平台,能运行JS写的代码,基于Google的V8引擎,也就是js代码能通过Node.js直接查看。

node.js 的使用

右键点击要使用文件,然后点击在集成终端打开。

image.png

node.js常用指令

dir	查看当前文件夹下的所有文件
tree	以树状图结构展示当前目录下所有文件及子目录下所有文件
cd 文件夹	进入当前目录下的某一个目录
cd…	返回上一个目录
D:	切换盘符
cls	清空命令行窗口
ipconfig	查看当前电脑的id地址
ping www.baidu.com	查看百度网速
systeminfo	查看当前电脑信息
md test	创建一个名为test文件夹
rd test	移除当前文件夹下的名为test文件夹
xcopy test test1	复制一份test文件夹起名为test1
type nul>index,js	在当前目录下创建一个名为index.js文件
copy index.js	复制一份index.js文件
echo console.log(‘hello world’)>index.js	向index.js文件中写入文本console.log(‘hello world’)
type index.js	查看index.js中内容
ren index.js second.js	将index.js重命名为second.js
del index.js	删除index.js
move index.js a	移动index.js到a文件夹下
node index.js	运行index.js
ctrl+c	停止运行

web服务器

第一步: 引入node.js的http模块。

第二步: 创建web服务对象。 request请求对象,前端请求

第三步: 启动web服务器,监听端口,端口区分同一台电脑中不同web应用。 示例:

//调用内部模块require
var http=require('http')
//构造一个服务(接受两个参数request浏览器请求,response返回给浏览器的结果)
var server=http.createServer(function(request,response){
    response.writeHead(200,{'Content-Type':'text/plain'})
    response.write('hello world')
    response.end()

})
//监听3000端口
server.listen(3000)
//用于成功启动时输出server started linsten 3000
console.log('server started linsten 3000');


//当在浏览器窗口输入http://localhost:3000
//页面出现hello world

注:当无法打开时

  1. 检查端口是否正确
  2. 查看服务器是否在本地,如果不在的话,需要将localhost替换为服务器ip
  3. 检查电脑防火墙是否对此类端口开放

fs方法

fs模块是和node.js一起下载安装的一个全局模块。

调用fs.readFile()方法来读取文件内容:

 fs.readFile(path,[options],callback)
  1. 中括号里可选参数,表示以什么编码格式读取文件
  2. path表示文件路径
  3. callback表示回调函数拿到结果

代码示例:

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

//调用fs.readFile()方法读取文件
//参数一:读取文件的路径
//参数二:读取文件时候采用的编码格式,默认”utf8“
//参数三:回调函数返回成功还是失败的结果err和dtaStr
fs.readFile('../node01/test.txt','utf8',function(err,dtaStr){
//读取信息失败
    if(err){
        return console.log('读取信息失败>>>',err);
    }
    //读取信息成功
    console.log('读取信息成功>>>',dtaStr)
})
})
//当前文件夹下有一个test.txt,里面有内容hello worle

//结果null
//    hello worle

调用fs.writeFile()方法,写入文件的内容:

第一步: 创建一个js文件导入fs模块,来操作文件。

第二步: 调用fs.writeFile()方法,写入文件的内容

   fs.writeFile(file,data[,options],callback)
  1. file文件路径,data内容,options编码格式,callback返回结果。
  2. fs.writeFile()不能重写路径,但可以重写文件,意思是在当前文件夹下如果没有该文件,就自己写文件,如果有就向文件写入内容。
  3. fs.writeFile()被多次写入内容不会报错,新的内容会覆盖旧的内容。

代码示例:

//引入fs文件系统模块
const fs=require('fs')

//调用fs.writeFile()方法,写入文件的内容
  //参数一:文件的存放路径
  //参数二:写入想要的文件内容
  //参数三:回调函数
  
fs.writeFile('../node01/02test.txt','学学习',function(err){
  if(err){
    return console.log('创建失败>>>'+err.message);
  }
    console.log('写入成功>>>')
})
//写入成功02test.txt的内容为学学习

注释: 写入成功后,被写入文件的会有写入的内容,否则返回的是错误对象。

结合fs.readFile和fs.writeFile方法举例:

//导入模块
const fs = require('fs')
//调用fs.readFile()读取文件内容
fs.readFile('../练习/素材/成绩.txt', 'utf8', function (err, dataStr) {
    if (err) {
        console.log('读取失败>>>' + err.message);
    }
    // console.log('读取成功>>>'+dataStr);
    //先分割数组
    const arrOld = dataStr.split(' ')
    //循环数组,然后对每一项的等号进行替换
    const arrNew = []
    arrOld.forEach(item => {
        arrNew.push(item.replace('=', ':'))
    })
    //把数组的每一项进行合并,组成一个字符串
    const nowStr = arrNew.join('\r\n')
    //用fs.writeFile()方法,把处理完毕的成绩,写到新文件中
    fs.writeFile('../练习/素材/成绩-01.txt', nowStr, function (err) {
        if (err) {
            console.log('创建失败>>>' + err.message);
        }
        console.log('创建成功>>>');
    })
})

path路径模块

第一步: 先引入内部模块const path=require(‘path’).

第二步: 将多个路径片段拼接成一个完整的路径path.join()

const pathStr=path.join('/a','/b','…/',/c')
//结果\a\c
注: …/会抵消到上一个相邻位置
const pathStr=path.join(__dirname,'./test.txt')
//当前目录下的test.txt文件

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

const route='/a/b/c/test.js'
let textName=path.basename(route)
console.log(textName)
//结果test.js
let name=path.basename(route,'.js')
console.log(name)
//结果test

获取文件扩展名

const route='/a/b/c/test.js'
let extName=path.extname(route)
console.log(extName)
//结果.js

结合fs.readFile和fs.writeFile方法加上patn.join拼接路径来举例:

示例:提取一个html文件,将css样式、js脚本和HTML标签分离出来,并将其改为外联式后重新存储

//导入fs模块
const fs = require('fs')
//导入path模块
const path = require('path')

//利用正则表达式,分别匹配<style></style>和<script></script>
const regStyle = /<style>[\s\S]*<\/style>/
const regScript = /<script>[\s\S]*<\/script>/


//调用fs.readFile()方法来读取文件
fs.readFile(path.join(__dirname, './modular/01index.html'), 'utf8', (err, dataSrt) => {
    //读取失败
    if (err) {
        return console.log('读取html文件失败' + err.message);
    }
    //读取成功就调用三个方法来分割css样式,标签和Script脚本
    resolveCss(dataSrt)
    resolveJs(dataSrt)
    resolveHtml(dataSrt)
})
//定义一个处理css文件的方法
function resolveCss(htmlStr) {
    //使用正则提取需要的内容
    const r1 = regStyle.exec(htmlStr)
    //将提取出来的样式字符串,进行字符串的replace操作
    const newCss = r1[0].replace('<style>', '').replace('</style>', '')
    //使用fs.writeFile()方法,将提取出来的css样式写入modular文件夹下的index.css中
    fs.writeFile(path.join(__dirname, './modular/index.css'), newCss, function (err) {
        if (err) {
            return console.log('写入css样式失败' + err.message);
        }
        console.log('写入css样式成功');
    })
}

//定义一个处理js脚本的方法
function resolveJs(htmlStr) {
    //使用正则提取需要的内容
    const r2 = regScript.exec(htmlStr)
    //将提取出来的样式字符串,进行字符串的replace操作
    const newJs = r2[0].replace('<script>', '').replace('</script>', '')
    //使用fs.writeFile()方法,将提取出来的js脚本写入modular文件夹下的index.js中
    fs.writeFile(path.join(__dirname, './modular/index.js'), newJs, (err) => {
        if (err) {
            return console.log('写入javaScript脚本失败' + err.message);
        }
        console.log('写入avaScript脚本成功');
    })

}
//定义一个处理html的方法
function resolveHtml(htmlStr) {
    //使用字符串的replace方法将内嵌的style和script替换为link外联式
    const newHtml = htmlStr.replace(regStyle, '<link rel="stylesheet" href="./index.css">').
        replace(regScript, '<script src="./index.js"></script>')
    //使用fs.writeFile()方法,将提取出来的html脚本写入modular文件夹下的index.html中
    fs.writeFile(path.join(__dirname, './modular/index.html'), newHtml, (err) => {
        if (err) {
            return console.log('写入htmlm成功' + err.message);
        }
        console.log('写入html成功');
    })
}

http网络模块 网络基础知识

1.ip地址

互联网中每一台WEB服务器都要自己的唯一ip地址。(通过ip地址访问服务器,用于测试的ip地址127.0.0.1)

2.域名和域名服务器

由于ip地址太长并且没有语义化,就出现了域名这种替代ip的访问方式类似于baidu.com,域名服务器就是将域名和ip两者进行互换。

3.端口号

一台服务器上有成千上百个服务,每个端口号对应一个服务。 注: 80端口号在js编辑时可以省略。

创建一个WEB服务器

(1).首先调用http内置内置模块require(‘http’)

(2).创建WEB服务http.createServer()

(3).监听服务server.listen()

代码示例:

//导入http模块
const http=require('http')
//创建基本的web服务器
const server=http.createServer()
//为服务器实例绑定request事件,监听客户端的请求
server.on('request',(req,res)=>{
    console.log('服务器响应成功>>>')
})
//启动服务器
server.listen(8080,()=>{
    console.log('server running at http://127.0.0.1:8080')
})

WEB服务器的两个对象
1.req请求对象包含与客户端相关的数据和属性.
(req.url客户端请求的地址)
(req.method客户端请求的方法类型)

2.res响应对象,向客户端传输内容.
(res.end像客户端响应内容)
代码示例:

const http = require('http')
const server = http.createServer()
//req是请求对象,包含了与客户端相关的数据和属性
server.on('request', (req,res) => {
    //req.url是客户端请求的URL地址
    const url = req.url
    //req.method是客户端请求的method类型
    const method = req.method
    const str = `yous request url is ${url}.your request method is ${method}`
    //使用res.end()方法,像客户端响应内容。
    res.end(str)
    console.log(str);
})
//启动服务器
server.listen(80, () => {
    console.log('server request gt http://127.0.0.1');
})

解决中文乱码问题
调用res.setHeader()方法,设置Content-Type 响应头,解决中文乱码的问题。

res.setHeader(‘Content-Type’,‘text/html;charset=utf-8’)
代码示例:

const http=require('http')
const server =http.createServer()


server.on('request',(req,res)=>{
    //定义一个字符串,包含中文的内容
    const str=`您请求的 url 地址是 ${req.url}.请求的 method 类型是 ${req.method}`
    //调用res.setHeader()方法,设置Content-Type 响应头,解决中文乱码的问题
    res.setHeader('Content-Type','text/html;charset=utf-8')
    //将内容返回给客户端
    res.end(str)
})
//启动服务端
server.listen(80,()=>{
    console.log('server request gt http://127.0.0.1');
})

  • 根据不同的url地址响应不同的html内容
  • 获取请求的url地址
  • 设置默认响应内容为404 Not found
  • 判断用户的请求
  • 防止乱码
  • 使用res.end()将内容给客户端
代码示例:
const http=require('http')
const server=http.createServer()

server.on('request',(req,res)=>{
//1.获取请求的地址url
const url=req.url
//2.设置默认响应的内容404 Not found
let content='<h1>404 Not found</h1>'
//3.判断用户请求是否为/或者/iindexx.htmml 主页
//4.判断用户请求是否为/about.html 关于页面
if(url==='/'||url==='/index.html'){
    content='<h1>首页</h1>'
}else if(url==='/about.html'){
    content='<h1>关于页面</h1>'
}
 //调用res.setHeader()方法,设置Content-Type 响应头,解决中文乱码的问题
 res.setHeader('Content-Type','text/html;charset=utf-8')
 //将内容返回给客户端
 res.end(content)
})

//启动服务端
server.listen(80,()=>{
    console.log('server request gt http://127.0.0.1');
})

结合fs、path模块和WEB服务器来实现当客户端输入不同访问地址显示不同的页面

//导入fs模块
const fs = require('fs')
//导入path模块
const path = require('path')
//导入http模块
const http = require('http')
//创建web服务器

const server = http.createServer()

//监听wed的request事件
server.on('request', (req, red) => {
    //获取到客户端请求的 URL 地址
    // /modular/index.css
    // /modular/index.js
    // /modular/index.html

    const url = req.url
    //把请求的 ULR 地址映射为具体文件的存放路径
    //优化路径操作
    //定义一个空的fpath 
    let fpath=''
    if(url==='/'){
        fpath=path.join(__dirname,'/modular/index.html')
    }else{
        fpath=path.join(__dirname,'/modular',url)
    }
    // const fpath = path.join(__dirname, url)

    //根据“映射”过来的文件路径,读取文件的内容
    fs.readFile(fpath,'utf8',(err,dataStr)=>{
     //读取失败返回固定的错误消息
     if(err){
         return red.end('<h1>404 Not found</h1>')
     }
     //读取文件成功返回读取的文件信息
     red.end(dataStr)
    })
})

//启动服务端事件
server.listen(80, () => {
    console.log('server request gt http://127.0.0.1');
})

nvm管理node版本

nvm可以管理nodeJS的版本,在一台电脑需要适配多个项目的nodeJS运行环境时使用nvm来管理nodeJS的版本就会更方便高效。

安装前记得先卸载nodejs,然后安装nvm,傻瓜操作一路next即可,记得记住nvm的安装位置。(安装nvm前可以不卸载已安装的node,在nvm安装过程中系统会弹框提示是否把已安装的node作为可控,确定就行)

nvm -V 查看版本号

如果你希望下载资源的时候速度更快,可以使用国内的淘宝镜像 找到nvm安装的位置,打开settings.txt文件,在里面换行添加下面的路径保存退出即可。

image.png

nvm的指令使用

nvm off                     // 禁用node.js版本管理(不卸载任何东西)
nvm on                      // 启用node.js版本管理
nvm install <version>       // 安装node.js的命名 version是版本号 例如:nvm install 8.12.0
nvm uninstall <version>     // 卸载node.js是的命令,卸载指定版本的nodejs,当安装失败时卸载使用
nvm ls                      // 显示所有安装的node.js版本
nvm list available          // 显示可以安装的所有node.js的版本
nvm use <version>           // 切换到使用指定的nodejs版本
nvm v                       // 显示nvm版本
nvm install stable          // 安装最新稳定版

使用npm包管理工具的常用指令

npm安装指令

npm install xxx  利用 npm 安装xxx模块到当前命令行所在目录
npm install xxx 安装但不写入package.json
npm install -g xxx 利用npm安装全局模块xxx
npm install xxx –save 安装并写入package.json的”dependencies”中
npm install xxx –save-dev 安装并写入package.json的”devDependencies”中

npm删除指令

npm uninstall xxx 删除xxx模块;
npm uninstall -g xxx 删除全局模块xxx;

npm打包指令

npm run build 打包项目文件

试用nvm管理nodejs版本的时候可能会出现的问题

在使用nvm时切换了nodejs的版本会如果不兼容开发项目时使用的nodejs版本就会报下面的错误,启动不了服务器,只需要切换到对应的nodejs版本就行。

FailureMessage Object: 00000013C8EFD490npm ERR!  code ELIFECYCLE 
npm ERR!  errno 3221225477 
npm ERR!  official-web@0.1.0 serve: `vue-cli-service serve` 
npm ERR!  Exit status 3221225477 
npm ERR! 
npm ERR!  Failed at the official-web@0.1.0 serve script. 
npm ERR!  This is probably not a problem with npm.  There is likely additional logging output above. 
 
npm ERR!  A complete log of this run can be found in: 
npm ERR!      C:\Users\86189\AppData\Roaming\npm-cache\_logs\2022-10-08T02_23_25_004Z-debug.log 
 
D:\official website\official-web>