node.js基础

node.js基础

  • 🍓什么是node.js
  • 🍓node.js模块
    • 🍒🍒 内置模块
      • 🍅🍅🍅fs模块
      • 🍅🍅🍅path模块
      • 🍅🍅🍅http模块
    • 🍒🍒自定义模块
    • 🍒🍒第三方模块
      • 🍅🍅🍅npm
      • 🍅🍅🍅包的分类
      • 🍅🍅🍅规范包的组成结构
      • 🍅🍅🍅发布自己的包
      • 🍅🍅🍅express
        • 🍓🍅🍅🍅express`创建`web服务器的步骤
        • 🍓🍅🍅🍅挂载路由
        • 🍓🍅🍅🍅req获取请求参数
        • 🍓🍅🍅🍅app.use()函数
        • 🍓🍅🍅🍅路由模块化:
        • 🍓🍅🍅🍅中间件
          • 🍒🍒🍅🍅🍅定义中间件
          • 🍒🍒🍅🍅🍅注册中间件
          • 🍒🍒🍅🍅🍅中间件的分类
          • 🍒🍒🍅🍅🍅中间件解决跨域问题
  • 🍓node.js常用命令

🍓什么是node.js

  • 定义: node.js是一个基于Chrome V8 引擎的JavaScript运行环境(后端javaScript运行环境)
    浏览器属于JavaScript前端运行环境
  • node.js官网:https://nodejs.org/en

🍓node.js模块

  • 📌引入模块的方式
    //引入fs模块(内置模块和三方模块需要写上模块名)
    const fs = require('fs')//引入自定义模块(自定义模块需要写上js路径)
    const dataFormat = require('./dataFormat.js')
    
  • 📌模块分类
    • 🍁内置模块:
      fs、path、http
    • 🍁自定义模块:
      用户创建的每一个js文件,引用自定义模块,需要通过相对路径使用
    • 🍁第三方模块
  • 📌模块作用域
    在模块中定义的全局变量var,作用域只在模块自己内部,可以解决全局变量被污染的问题
  • 📌向外暴露模块作用域的成员:
    每一个.js自定义模块中都有一个module对象,module对象中的成员exports对象用来对外暴露模块作用域中的成员

🍒🍒 内置模块

🍅🍅🍅fs模块

引入fs内置模块

const fs = require('fs')
  1. 📌fs模块用于操作文件
  2. 📌fs.readFile(path[, options], callback) 读取文件
    • 🍁path:必选参数,文件路径-字符串
    • 🍁options:可选参数,编码格式
    • 🍁callback:必选参数,文件读取成功的回调函数
      形参:
      • 🌷err:失败的结果
      • 🌷dataStr:成功的结果
    fs.readFile('C:\\Users\\Desktop\\abc.txt', 'utf8', (err, dataStr) => {if(!err) {console.log(dataStr);} else {console.error(err)}
    });
    
  3. 📌fs.writeFile(path, data[, options], callback) 写文件
    • 🍁path:必选参数,文件路径-字符串
    • 🍁data: 必选参数,写入内容
    • 🍁options:可选参数,编码格式
    • 🍁callback:必选参数,文件编写成功的回调函数
      形参:
      • 🌷err:失败的结果
    fs.writeFile('C:\\Users\\Desktop\\1.txt', "你好,nodejs", 'utf8', err => {if(err) {console.log(err)}
    })
    
  4. 📌fs.mkdir(path[, options], callback )创建目录
    • 🍁path:必选参数
    • 🍁options:可选参数(对象)
      • 🌷recursive
        true:递归创建
        false:不会递归创建
    • 🍁callback:必选参数,文件夹创建成功的回调函数
      形参:
      • 🌷err:失败的结果
      • 🌷path:文件夹路径,返回创建的第一层级的目录
  5. 📌fs.rmdir(path[, options], callback )删除目录
    • 🍁path:必选参数
    • 🍁options:可选参数(对象)
      • 🌷recursive
        true:递归删除
        false:不会递归删除
    • 🍁callback:必选参数,文件夹删除成功的回调函数
      形参:
      • 🌷err:失败的结果
      • 🌷path:文件夹路径,返回创建的第一层级的目录
  6. 📌fs.unlink(path, callback) 删除文件
    • 🍁path:必选参数
    • 🍁callback:必选参数,文件删除成功的回调函数
      形参:
      • 🌷err:失败的结果

🍅🍅🍅path模块

路径问题nodejs执行js时,js中的相对路径是参照node命令执行所在的目录,而不是参照js文件所在的目录

  1. 📌使用绝对路径(不推荐)
    缺点:
    移植性非常差,不利于维护
  2. 📌__dirname:代表当前文件所处的目录(不推荐)
    缺点:
    1. 🍁路径需要通过拼接的形式生成
    2. 🍁只能处理当前目录以下的文件,当前目录之前的文件无法处理
  3. 📌path模块(推荐)

引入path内置模块

const path = require('path')const pathStr = path.join('/a','/b/c','../','./d','e')
console.log(pathStr) //\a\b\d\econst fpath = '\a\b\v\index.html';
console.log(path.basename(fpath))   //index.html
console.log(path.basename(fpath, '.html')) //index
console.log(path.extname(fpath))    //.html
  • 🍁join(path0,path1,path2...,pathn):拼接多个路径,一个../消除一个前面的路径
  • 🍁basename(path[, ext]):获取文件名称
  • 🍁extname(path):获取文件的扩展名

🍅🍅🍅http模块

引入http模块

const http = require('http')
  1. 📌http模块用于创建web服务

  2. 📌创建http服务

    1. 🍁引入http模块
    2. 🍁创建web服务器实例
    3. 🍁为服务器绑定request事件,监听客户端的请求
    4. 🍁启动服务器
    //1. 引入http模块
    const http = require('http')
    //2. 创建web服务器实例
    const server = http.createServer()
    //3. 为服务器绑定request事件,监听客户端的请求
    server.on('request', function(req, res){const url = req.urlconst method = req.methodconsole.log(`Your request url is ${url}, and request method is ${method}`)res.setHeader('Content-Type', 'text/html;charset=utf-8')res.end('你好,nodejs')
    })
    //4. 启动服务器
    server.listen('8080', ()=>{console.log('server is runnging at http://127.0.0.1:8080')
    })
    
  3. 📌request事件回调函数

    • 🍁req:
      • 🌷req.url :获取请求路径
      • 🌷req.method :获取请求方式
    • 🍁res
      • 🌷res.end(str) :结束本次请求,并向客户端发送指定内容
      • 🌷res.setHeader(key, val) : 设置响应头

🍒🍒自定义模块

node.js中,自定义模块暴露成员通过挂载在module.exports对象上,其中exports对象默认也是内存地址指向module.exports,只要在挂载的时候没有更改module.exports对象的地址或者更改exports对象的地址就不会有问题。

//挂载属性
module.exports.name = '张三'//挂载方法
module.exports.sayHello = () => {console.log('Hello world!')
}//挂载属性
exports.age = 23//注意:该方式修改了module.exports对象内存地址的指向,导致module.exports和exports指向的不是同一个地址,则exports挂载属性不会生效。
module.exports = {code:'0000',message:'成功!'
}//注意:该方式修改了exports对象内存地址的指向,导致module.exports和exports指向的不是同一个地址,则exports挂载属性不会生效。
exports = {title:'爱好',content:'足球'
}

🍒🍒第三方模块

🍅🍅🍅npm

  • npm用于下载发布管理三方包,我们可以通过npm命令去下载安装一些三方包供我们项目使用
    查询包:https://www.npmjs.com/
    下载包:https://registry.npmjs.org/
  • node_modules是用于存放三方依赖的文件夹
  • package.json用于记录项目中使用的包,通过执行命令npm i来初始化项目,安装三方包

🍅🍅🍅包的分类

  • 📌项目包
    • 🍁定义:那些被安装到项目的node_modules目录中的包,被称为项目包
    • 🍁开发依赖包
      npm i {packageName} -D
      被记录到package.json文件中节点devDependencies下面的包被称为开发依赖包,只在开发期间会使用到
    • 🍁核心依赖包
      npm i {packageName}
      被记录到package.json文件中节点dependencies下面的包被称为核心依赖包,开发期间和项目上线后都会使用到
  • 📌全局包
    • 🍁安装全局包:npm i {packageName} -g
    • 🍁卸载全局包:npm uninstall {packageName} -g
    • 🍁全局依赖包会下载到C:\Users\用户目录\AppData\Roaming\npm\node_modules
    • 🍁注意:
      只有工具性质的包,才有全局安装的必要性,因为它们提供了好用的终端命令(一般官方文档里面会告诉你)

🍅🍅🍅规范包的组成结构

  • 包必须以单独的目录而存在
  • 包的顶级目录下必须包含package.json文件
  • package.json必须包含name、version、main这三个属性,分别代表包名、包版本、包的入口

🍅🍅🍅发布自己的包

  1. 📌在package.json中编写自己的包信息
    {"name":"{packageName}",  //必须与当前npm仓库中的包名不重名"version":"1.0.0",       //版本号"main":"index.js",       //包程序入口"description":"包的描述信息","keywords":["","",""...] //检索包的关键字信息"license":"ISC"          //开源许可协议
    }
    
  2. 📌编写README.MD文档,写明使用此包的方式
  3. 📌注册npm账号
    https://www.npmjs.com/
  4. 📌在终端输入以下命令,登录npm账号(在此之前,一定要先把下包的镜像地址切换到npm官方服务器)
    npm login
  5. 📌在包的根目录下输入以下命令,即可发布包
    npm publish

🍅🍅🍅express

express是基于内置模块http的基础上封装的一套可以方便、快速的创建Web网站服务器或API接口服务器
安装
npm i express

🍓🍅🍅🍅express创建web服务器的步骤
  1. 📌引入express模块

  2. 📌创建web服务器

  3. 📌启动web服务,监听端口

    const express = require('express')//创建web服务器
    const app = express()//启动web服务,监听端口
    app.listen('80', ()=>{console.log('express server running at http://127.0.0.1')
    })
    
🍓🍅🍅🍅挂载路由

app.get(url, function)
app.post(url, function)

🍓🍅🍅🍅req获取请求参数
  • 📌获取url地址传参:(形如:http://127.0.0.1/user?name=张三&age=23
    req.query.{key}
  • 📌获取动态地址传参:(形如:http://127.0.0.1/query/1234
    req.params.{key}
  • 📌获取请求体数据
    req.body(需要配置解析请求体数据的中间件)
    app.get('/user', function(req, res) {console.log('进入GET /user')//req.query 获取url地址传参(http://127.0.0.1/user?name=张三&age=23)const name = req.query.nameconst age = req.query.age//向客户端响应内容res.send({name, age})
    })app.get('/query/:id/:name',(req, res) => {//req.params 获取url地址的动态参数(http://127.0.0.1/query/1234/张三)const id = req.params.idconst name = req.params.nameres.send({id, name})
    })//express.urlencoded({extended:false})
    //express.json()
    app.post('/add/user', express.json(), (req, res) => {console.log(req.body)res.send(req.body)
    })
    
🍓🍅🍅🍅app.use()函数
  • 📌挂载静态资源:
    app.use(express.static({static_path}))
    app.use('{地址前缀}', express.static({static_path}))
  • 📌路由模块化:
    app.use(模块路由)
    app.use({地址前缀}, 模块路由)
  • 📌注册中间件
    app.use({中间件名称})
🍓🍅🍅🍅路由模块化:

问题: 通过app去挂载路由,会导致js文件臃肿,难以维护,路由模块化可以解决这个问题

  1. 📌引入express模块

  2. 📌创建路由对象

  3. 📌挂载路由

  4. 📌暴露路由对象

  5. 📌app.use()注册路由对象

    //引入express模块
    const express = require('express')//创建路由对象
    const router = express.Router()router.get('/user/list', (req, res) => {res.send([{name:'张三',age:23},{name:'李四', age:24}])
    })//暴露路由(注意:这里不能使用exports = router)
    module.exports = router//注册路由
    const xxx = require('./xxx.js')
    app.use(xxx)
    
🍓🍅🍅🍅中间件
🍒🍒🍅🍅🍅定义中间件
//普通中间件
const mw = function(req, res, next){//放行next()
}//错误中间件
const mw = function(err, req, res, next){//放行next()
}
🍒🍒🍅🍅🍅注册中间件
  • 📌全局中间件注册:app.use(mw)
  • 📌单个局部中间件注册:app.get(url, 中间件, 函数)
  • 📌多个局部中间件注册:app.get(url, [中间件1, 中间件2, ..., 中间件n], 函数)
    //定义全局中间件
    const mw = function(req, res, next){console.log('最简单的中间件函数')//流转给后面的路由next()
    }
    //注册全局中间件
    app.use(mw)//定义中间件
    const mv2 = function(req, res, next){console.log('最简单的中间件函数2')next()
    }//挂载路由,监听客户端post请求,请求地址是/user
    //将中间件mv2注册为局部中间件
    app.post('/user', mv2, function(req, res){console.log('进入POST /user')throw new Error('服务器内部发生了错误!')res.send({code:'000000', msg:'请求失败!'})
    })//定义中间件
    const mv3 = function(req, res, next){console.log('最简单的中间件函数3')next()
    }//挂载路由,监听客户端动态地址传参
    //注册多个局部中间件
    app.get('/query/:id/:name', [mv2, mv3],(req, res) => {//req.params 获取url地址的动态参数(http://127.0.0.1/query/1234)const id = req.params.idconst name = req.params.nameres.send({id, name})
    })
    
  • 📌多个中间件之间,共享同一份reqres,我们可以在上游的中间件中为reqres挂载某些属性和方法为下游中间件使用
    调用顺序:(与中间件注册的顺序有关)
    客户端请求 => 中间件1 => 中间件2 => 中间件3 => … => 中间件n => 响应客户端
🍒🍒🍅🍅🍅中间件的分类
  1. 📌应用级别的中间件
    通过app.use()、app.get()、app.post()绑定的
  2. 📌路由级别的中间件
    通过router.use()、router.get()、router.post()绑定的
  3. 📌错误级别的中间件(注意:错误的中间件一定要放在最后定义)
    app.use(function(err, req, res, next))
    //挂载路由,监听客户端post请求,请求地址是/user
    //将中间件mv2注册为局部中间件
    app.post('/user', mv2, function(req, res){
    console.log('进入POST /user')
    throw new Error('服务器内部发生了错误!')
    res.send({code:'000000', msg:'请求失败!'})
    })//定义全局错误中间件
    app.use(function(err, req, res, next){
    console.log('发生了错误:' + err.message)
    res.send(err.message)
    })
    
  4. 📌Express内置的中间件
    配置解析 application/json 格式请求体数据的内置中间件
    app.use(express.json())
    配置解析 application/x-www-form-urlencoded 格式请求体数据的内置中间件
    app.use(express.urlencoded({extended:false}))
    由于express解析请求体数据中间件在4.16.0之后才支持,在此版本之前使用body-parser中间件解析请求体
    • 🍁下载body-parser
      npm install body-parser
    • 🍁引入body-parser模块
    • 🍁调用app.use()注册中间件
      app.use(parser.json())
      app.use(parser.urlencoded({extended:false}))
🍒🍒🍅🍅🍅中间件解决跨域问题
  1. 📌安装cors中间件
    npm i cors
  2. 📌注册cors中间件为全局中间件
    app.use(cors())
  3. 📌cors相关的响应头
    • 🍁Access-Control-Allow-Origin:*|具体的http地址
      • 🌷*:允许任何请求访问
      • 🌷具体的http地址:如http://app.cn.nb:81,表示只允许这个ip开头的客户端可以访问
    • 🍁Access-Control-Allow-Headers
      • 🌷允许客户端发送的请求头
      • 🌷默认情况下,cors仅支持客户端发送如下的请求头:
        Accept、Accept-Language、Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width、Content-Type(值仅限于text/plain、multipart/form-data、application/x-www-form-urlencoded
    • 🍁Access-Control-Allow-Methods
      默认情况下,cors仅支持客户端发起GET、PUT、HEAD请求

🍓node.js常用命令

# 1. node版本查看
node -v# 2. 运行javaScript脚本
node xxx.js# 3. npm版本查看
npm -v# 4. 安装下载包(默认下载最新版本)
npm install {packageName}
npm i {packageName}# 5. 安装下载包(指定下载版本)
npm install {packageName}@{version}
npm i {packageName}@{version}# 6. 初始化项目,根据package.json安装三方包
npm install
npm i# 7. 卸载包
npm uninstall {packageName}# 8. 创建package.json
npm init -y# 9. 安装下载开发环境的包
npm i {packageName} -D
npm i {packageName} --save-dev# 10. 检查当前下包镜像源
npm config get registry# 11. 切换下包镜像源
npm config set registry=https://registry.npm.taobao.org/# 12. 使用nrm快速切换镜像源
## 12.1. 下载安装nrm,将nrm安装成全局可用的工具
npm i nrm -g
## 12.2. 查看所有可用的镜像源
nrm ls
## 12.3. 将下载的镜像源切换为taobao镜像
nrm use taobao# 13. 安装全局包
npm i {packageName} -g# 14. 卸载全局包
npm uninstall {packageName} -g# 15. 登录npm账号
npm login# 16. 发布包(包根目录下执行)
npm publish# 17. md文件转html
## 17.1 下载安装i5ting_toc,将i5ting_toc安装成全局可用的工具
npm i i5ting_toc -g
## 17.2 md文件转html
i5ting_toc -f xxx.md -o

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1017 A除以B

本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 ABQR 成立。 输入格式: 输入在一行中依次给出 A 和 B,中间以 1 空格分隔。 输出格式: 在一行中依…

Matlab之让特别大的数字显示全,不用科学计数法的形式

一、常见大数显示形式 matlab会自动将特别大的数字,采用科学计数法显示。 bigNum 1234567890000000000000 二、显示大数所有位数 这里采用的是将数字转为字符,并用定点表示 bigNum 1234567890000000000000; bigNumstr num2str(bigNum, %.0f); % 使用…

如果我忽然嗝屁了,家人怎么继承我的财产

前言 笔者很喜欢的电影《寻梦环游记》有这么一句经典台词:“真正的死亡是世界上没有一个人记得你”。 然而,现实中我们所说的“死亡”,其实就是 他再不能与这个世界、与自己在乎的人有新的互动了。 本文,笔者想写一写 关于死亡的…

Java的String类常用方法 |StringBuilder和StringBuffer

文章目录 String类常用方法字符串查找转化字符串替换字符串拆分字符串截取其他操作方法 字符串的不可变性StringBuilder和StringBufferStringBuilder的介绍面试题 String类常用方法 字符串查找 方法功能char charAt(int index)返回index位置上字符,如果index为负数…

Python polars库:高性能数据操作的利器

更多资料获取 📚 个人网站:ipengtao.com 在数据处理和分析领域,Python一直以来都是一种热门的编程语言。近年来,随着数据量的增加和对性能的需求,一些新的数据处理库也逐渐崭露头角。其中,polars库作为一个…

Python面向对象之跨类调用(Python系列17)

在面向对象的思想中,常见的一个问题是: 老张开车去东北 针对于这句话,如何使用面向对象的思想去解决 # 跨类调用 class Person:def __init__(self, name"", age0, sex"男"):self.name nameself.age ageself.sex se…

c#编码技巧(十八):新语法糖record深入分析

c#编码技巧(十四):新语法糖record深入分析 从 C# 9 开始新增了一个关键字record,用于封装数据。 record实质是微软提供的一个语法糖,因很多开源项目都用到了这个关键字,说明这个语法糖比较实用。 那么这个record类型和普通class类…

Playwright:下一代自动化测试工具

随着Web应用的普及,自动化测试变得越来越重要。在众多的自动化测试工具中,Playwright 是一个值得关注的新秀。本文将详细介绍 Playwright 的特点、优势以及如何使用它进行自动化测试。 一、Playwright 简介 Playwright 是一个用于自动化浏览器操作的 N…

C++ 11 初识2

一.新的类功能 默认成员函数 原来 C 类中,有 6 个默认成员函数: 构造函数 析构函数拷贝构造函数拷贝赋值重载 取地址重载const 取地址重载 C11 新增了两个:移动构造函数和移动赋值运算符重载。 针对移动构造函数和移动赋值运算符重载有一些需…

Python Paramiko库:SSH远程连接与文件传输实战指南

更多资料获取 📚 个人网站:ipengtao.com 在网络管理和系统运维中,SSH(Secure Shell)是一种广泛用于远程登录和文件传输的协议。Python中的Paramiko库为开发者提供了灵活、强大的SSH客户端和服务器功能。本文将深入探讨…

Codeforces Round 912 (Div. 2)

Codeforces Round 912 (Div. 2) A 大等于2依据冒泡排序即可排序&#xff0c;因此判断下1即可 #include <bits/stdc.h>using namespace std;const int N 1e5 10; int a[N];void solve() {int n , m;cin >> n >> m;for(int i 1 ; i < n ; i ){cin >…

有哪些话一听就知道一个程序员是个水货?

前端&#xff1a;你给我传个时间戳吧。 我&#xff1a;什么是时间戳&#xff1f; 前端&#xff1a;啊&#xff1f; 我&#xff1a;哦哦。我自己百度吧。

改dns会有什么影响?

改变DNS&#xff08;Domain Name System&#xff09;会对网络连接和域名解析产生影响。下面是一些可能的影响&#xff1a; 域名解析速度&#xff1a;DNS服务器的选择和性能可能会影响域名解析的速度。如果你更改为更快的DNS服务器&#xff0c;域名解析时间可能会缩短&#xff0…

LeetCode922. Sort Array By Parity II

文章目录 一、题目二、题解 一、题目 Given an array of integers nums, half of the integers in nums are odd, and the other half are even. Sort the array so that whenever nums[i] is odd, i is odd, and whenever nums[i] is even, i is even. Return any answer a…

LeetCode刷题--- 验证二叉搜索树

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 http://t.csdnimg.cn/ZxuNL个人专栏&#xff1a;力扣递归算法题 http://t.csdnimg.cn/ZxuNL 【C】 http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#x…

分享5款不起眼但非常实用的小工具

​ 时光荏苒&#xff0c;科技日新月异&#xff0c;一些看似不起眼的小工具却可能改变我们的工作方式。下面我们将介绍五款不可错过的小工具&#xff0c;它们能给你带来一些意想不到的效果&#xff0c;让你的工作更加高效便捷。 1.音乐播放——洛雪音乐助手 ​ 洛雪音乐助手是…

什么是原子性?

Lindaaker explained that ‘atomic’ comes from Greek and meaning ‘undividable.’ 参考&#xff1a; JavaOne 2012: How Do Non-Blocking Data Structures Work? 参考&#xff1a; JavaOne 2012: How Do Non-Blocking Data Structures Work? 中文翻译 原子&#xff08;…

No module named ‘osgeo’解决办法

from osgeo import gdal 报错&#xff1a;No module named ‘osgeo’ pycharm安装osgeo、GDAL都失败 pip install osgeo失败 最后先下载对应版本的GDAL文件 再cmd命令行中用对应环境的python进行GDAL包安装 1.我将我的Anaconda某个环境文件夹D:\software\pinstall\Anaconda3…

Source Tree回滚 重置 贮藏操作

回滚提交 source tree的回滚提交: 在执行该操作时将会对history中提交的指定节点直接进行回滚,将该节点执行的提交操作撤销(如当前节点是提交文件,执行回滚提交时将会删除该文件,如果当前节点的前面的节点对该节点内容进行修改后,执行回滚提交时需要执行冲突解决),同时生成一次…

【算法集训】基础数据结构:六、栈和队列

做这几天的数据结构的题目的时候有很多函数需要填写&#xff0c;这里需要有一个大致的顺序&#xff0c;一般是先补全结构体&#xff0c;也就是创建队列 | 栈&#xff1b; 而后初始化&#xff0c;设置初值create&#xff08;&#xff09;函数&#xff0c;再然后C语言需要释放&am…