node.js

173 阅读9分钟

NODEJS

介绍

干嘛的

写后台管理程序,与之类似php .net java

简单的说 Node.js 就是运行在服务端的 JavaScript

Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。

Node.js是一个事件驱动I/O服务端JavaScript环境基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

目标(提供的服务)

数据服务,文件服务,web服务

优势

性能高,方便、入门难度低、大公司都在用(BAT)

劣势

  • 服务器提供的相对较少
  • 相对其他语言,能用的上的学习资料少
  • 对程序员的要求高了

环境安装

官网

开发工具

IDE偏重,对机器要求高,功能齐全,

编辑器,轻便,速度快,功能后期补装插件

IDE

Hbuild WebStorm HbuildX Eclipse

编辑器

Atom Visual Studio Code Sublime Text

node命令行

node 回车

运行js文件

window
a. 找到目标目录->地址栏输入cmd->node 文件名.js | node 文件名

b. 当前目录->右键->git bash-> node 文件名
苹果
终端->cd 目录-> node 文件名.js | node 文件名
vscode
新建终端->cd 目录->node 文件名.js | node 文件名 
webstrom
terminal| run

开发注意

nodejs 使用的是ECMA语法,不可使用DOMBOM

web服务器

构成

  • 机器: 电脑
  • 数据库:mysql | sqlserver | mongoDB | oracle
    • 数据库存的是: 数字|字符
    • 磁盘(硬盘) 文件本身(图,视频,PDF) 文件服务器
  • 管理程序:nodejs(管理前后端工程文件)

前后端交互流程

大后端

​ 用户 - > 地址栏(http[s]请求) -> web服务器(收到) - > nodejs处理请求(返回静态、动态)->请求数据库服务(返回结果)->nodejs(接收)->node渲染页面->浏览器(接收页面,完成最终渲染)

大前端

​ 用户 - > http[s]请求 -> web服务器(收到) - > nodejs处理请求(返回静态、动态)->请求数据库服务(返回结果)->nodejs(接收)->返回给前端(渲染)->浏览器(接收数据,完成最终渲染)

实现

引入http模块 commonJS规范

let http = require('http')

创建web服务 返回http server对象

let app = http.createServer((req,res)=>{
	req 请求体  浏览器->服务器
	req.url  地址   提取地址栏数据
	
	res 响应  服务器->浏览器
	res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});响应头设置
	res.write() 返回数据给前端
	res.end() 结束响应 必须
})

监听服务器

app.listen(端口,[地址][回调])

监听成功,回调一次

端口: 1-65535 1024以下系统占用

虚拟地址localhost 真实域名xx.duapp.com

更新后,需要每次服务器自动重启

推荐命令行工具:supervisor nodemon

安装方式: npm install supervisor -g or npm install nodemon -g

问题: vscode里面有的学生电脑找不到nodemon命令?

s1.ax1x.com/2020/05/19/…

静态资源托管

什么是静态资源

xx.css xx.html xx.js xx.图片 xx.json xx.字体 ...

前端资源请求

<a href=".."></a>
<img src="..."/>
location.href="..."
body{
    background:url(....)
}

后端资源读取

fs.readFile(文件名,[编码方式],回调(err,data));

接口实现

前端

表单:get/post/put/delete/...

js: ajax/jsonp

后端

处理方式:http[s]

​ address: req.url 抓取 get请求的数据 切字符 | url模块

​ !address: req.on('data',(chunk)=>{CHUNK==每次收到的数据buffer})

req.on('end',()=>{ 接收完毕 切字符 querystring })

postman 一个不用写前端,就可以发出各种请求的软件 下载

fs模块

磁盘操作,文件操作

读取文件

fs.readFile('文件路径',[编码方式],(err,data)=>{})
变量 = fs.readFileSync('文件路径',[编码方式]) 

处理错误

try{要排错的代码}catch(e){}

try {
    let data = fs.readFileSync("./html/index2.html")
    console.log(data)
} catch (error) {
    //处理错误信息
    console.log("error====>",error)
}
console.log(2222222222222)

更名文件

fs.renameSync('改前','改后');

删除文件

fs.unlinkSync('文件路径')

删除目录

fs.rmdirSync(path[, options])

url模块

作用

处理 url型的字符串

用法

url.parse(str,true)  返回 对象	true处理query为对象  {a:1,b:2}

str -> obj 返回 对象 true protocol: 'http:', 协议 slashes: true, 双斜杠 auth: null, 作者 host: 'localhost:8002', 主机 port: '8002', 端口 hostname: 'localhost', baidu hash: '#title', 哈希(锚) search: '?username=sdfsdf&content=234234', 查询字符串 query: 'username=sdfsdf&content=234234', 数据 pathname: '/aaa', 文件路径 path: '/aaa?username=sdfsdf&content=234234', 文件路径 href: 'http://localhost:8002/aaa?username=sdfsdf&content=234234#title'

url.format(obj) 返回url字符串

urlObj -> urlStr 返回str

querystring 模块

作用

处理查询字符串 如:?key=value&key2=value2

用法

querystring.parse(str) 返回对象
querystring.stringify(obj) 返回字符串

NPM(包管理器)

作用 (www.npmjs.com/)

帮助你安装模块(包),自动安装依赖,管理包(增,删,更新,项目所有包)

类似:yarn

安装到全局环境

  • 安装到电脑系统环境下
  • 使用时在任何位置都可以使用
  • 被全局安装的通常是:命令行工具,脚手架
npm i 包名 -g					    安装
npm uni 包名 -g	 			    卸载

安装到项目环境

只能在当前目录使用,需要使用npm代运行

初始化项目环境(package.json)

npm init

初始化npm管理文件package.json

package-lock.json 文件用来固化依赖

{
  "name": "npm",	//项目名称
  "version": "0.0.1",	//版本
  "description": "test and play",	//描述
  "main": "index.js", //入口文件
  "dependencies": {  //项目依赖  上线也要用
    "jquery": "^3.2.1"
  },
  "devDependencies": { //开发依赖 上线就不用
    "animate.css": "^3.5.2"
  },
  "scripts": {	//命令行
    "test": "命令行",
  },
  "repository": {	//仓库信息
    "type": "git",
    "url": "xx"
  },
  "keywords": [  //关键词
    "test",'xx','oo'
  ],
  "author": "kery",
  "license": "ISC",	//认证
  "bugs": {
    "url": "xx"//问题提交
  },
  "homepage": "xx"//首页
}

项目依赖

只能在当前项目下使用,上线了,也需要这个依赖 --save

//安装
npm i 包名 --save  | -S
npm install 包名 -S
npm install 包名@x.x.x -S

//卸载
npm uninstall 包名 --save | -S
npm uninstall 包名 -S

开发依赖

只能在当前项目下使用,上线了,依赖不需要了 --save-dev

npm install 包名 --save-dev
npm install 包名 -D

查看包

npm list     列出所有已装包
npm outdated 版本对比(安装过得包)
npm info 包名 查看当前包概要信息 
npm view 包名 versions  查看包历史版本列表 

npm outdated 版本对比(安装过得包)

主版本.子版本(偶数).修正版本

npm info 包名 查看当前包概要信息

安装所有依赖

npm install 

安装package.json里面指定的所有包

选择源

npm install nrm -g     安装选择源的工具包
nrm ls 查看所有源
nrm use 切换源名

安装卡顿时

ctrl + c -> npm uninstall 包名  -> npm cache 清除缓存 ->4g网络 -> npm install 包名

YARN

官网

安装

去官网安装

注意:为省事,不要用npm i yarn -g,而去安装yarn的下载压缩包,保证注册表和环境变量的硬写入,后期通过yarn安装全局包时比较方便

使用

初始化一个新项目

yarn init

添加依赖包

yarn add [package]
yarn add [package]@[version]

将依赖项添加到不同依赖项类别中

分别添加到 dependencies,devDependencies中:

yarn add [package] --save   | -S 
yarn add [package] --dev    | -D 

升级依赖包

yarn upgrade [package]@[version]

移除依赖包

yarn remove [package]

安装项目的全部依赖

yarn

或者

yarn install

安装到全局

yarn global add [package]				//global的位置不能变
yarn global remove [package]

EXPRESS

nodejs库,不用基础做起,工作简单化,点击进入官网,类似的还有 koa

特点

基于 Node.js 平台,快速、开放、极简的 Web 开发框架

搭建web服务

let express = require('express')
let app=express()
app.listen(端口,地址,回调)

静态资源托管

app.use(express.static('./www'));

use

安装中间件、路由、接受一个函数

app.use([地址],中间件|路由|函数体)

中间件

middleware, 处理自定义业务,只处理请求到结束响应的中间部分

举例 (例如使用body-parser,来去增强req的功能)

let bodyParser=require('body-parser')//引入中间件
app.use(bodyParser())//安装中间件

body-parser 使用方式,实时查询 npm,可获得最新

接口响应

支持各种请求姿势:get、post、put、delete...

server.请求姿势API(接口名称,处理函数)
server.get(url,(req,res,next)=>{})
server.post(url,(req,res,next)=>{})
...

req 请求体

request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性

req.query //获取地址栏的数据
req.body //获取非地址栏的数据  依赖中间件 

req.params //获取动态接口名   app.get("/api/:id")
req.method //获取前端提交方式

注意:req.body依赖中间件

中间件使用:body-parser

  1. let bodyParser = require('body-parser')
  2. app.use(bodyParser ())

res 响应体

response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据

res.send(any) //对等 res.write + res.end
res.end(string|buffer)
res.json(json) //返回json
res.status(404).send({error:1,msg:"Sorry can't find that!"}) //返回一个404

路由

告诉你去哪,对于前端,主要是导向告诉浏览器应该去哪。对于后端,可以理解为一个子服务,一个路由就是一个小的服务,处理一类接口

// 1. 创建路由
let userRouter = express.Router();    

//2. 安装路由
app.use('地址',userRouter); 

//3. 路由处理响应
userRouter.响应API(地址, 处理函数)

假设你在浏览器 http://localhost:3000/api/user/login ===> app.use('/api/user',userRouter);

userRouter.get("/login",callback)

Mongodb 数据库

mongodb

非关系型数据库,又叫nosql

  1. 下载 安装帮助

  2. 配置数据文件存储位置:

找到安装目录 D:\web-software\mongo\data\db

data和db目录要手动创建

配置环境变量 目的:就是在终端里面使用mongod 与 mongo命令

  1. 服务端启动:

找到安装目录> mongod --dbpath 路径 (mongod --dbpath D:\web-software\mongo\data\db)

  1. 客户端启动:

找到安装目录> mongo

  1. 环境变量

为了在任意盘符下去都可以启动 mongod服务端|mongo客户端,把安装目录添加到环境变量

mysql vs mongodb

mysql (关系型数据库)mongoDb(非关系型数据库)
database(库)database(库)库没有区别
table(表)collection(集合)表 vs 集合
row(一条数据)document(文档)行记录 vs 文档
column(字段)field(区域)字段 vs 区域
二维表,每次存到磁盘json,存在缓存,关闭时存到磁盘存储方式

mongodb相关命令

    常看所有的数据库 : show dbs

	切换/创建数据库:use student

    删除数据库: db.dropDatabase()

    创建集合:db.createCollection('表名')  

    查看集合:db.getCollectionNames()  /  show collections

	插入数据:db.user.insert({}) 

    更新数据:db.user.update({条件},{$set:{age:25}},false,true)

    查询数据: db.user.find({})  

		     db.user.find({},{age:1,_id:0})

		     db.user.find({}).skip(3).limit(3)

	排序:    db.user.find().sort({age:1})

mongodb命令行操作

库操作

查:  show dbs
  	 db 查看当前库
建:	use 库名	   没有就创建,有就切换
删:  db.dropDatabase()  删除当前库

集合(表)操作

建:db.createCollection('集合名')
查:show collections / db.getCollectionNames()
删:db.集合.drop()

文档(row)操作

db.集合.insert({})  //添加一条
db.insertOne({}) //添加一条
db.集合.insert([{},{}]) //多条
db.集合.deleteOne({要删数据条件描述}) //一条
db.集合.remove({要删数据条件描述}) //多条
db.集合.remove({}) //清空表
db.集合.udpate({查询条件},{替换条件})

//将name为张三的年龄改为30  修改一条
db.studentInfo.update({name:"张三2"},{$set:{age:30}})      
//修改多条数据
db.studentInfo.updateMany({name:"张三2"},{$set:{age:40}})  
所有:db.集合.find(条件)
条数: db.集合.find().count()
db.集合.find({条件},{指定要显示列区域})


db.集合.find().limit(number)  //限定
db.集合.find().skip(number)	//跳过
db.集合.findOne()//找第一个
db.集合.find().limit(1)  //查询第一条

指定要显示列区域

username:1 显示这个区域

username:0 不显示这个区域

_id 是默认显示

db.集合.find().sort({key:1,key2:-1}) //升
db.集合.find().sort({key:-1})	//降