node.js

什么是nodejs

nodejs是一个基于chrome 浏览器的js解析器v8 (就是谷歌浏览器中内置的一个js翻译器)所推出的一个js运行环境

nodejs 是一个js的运行环境 同时nodejs可以在任何操纵系统上面进行运行 从而带来了js可以在脱离浏览器的情况下在任何操纵系统上单独运行

js缺点:

就是不能读取本地计算机硬盘上的内容(js就不能操纵本地计算机硬盘上的内容 在开发中 数据库是在硬盘上存储的 所以默认情况下js也不能操纵数据库)

但是 有利node之后 就可以让js来在node的环境下访问本地计算机硬盘上的内容 node环境下js也可以操纵数据库 那么我们前端的开发者就可以使用我们熟练的js 来编写后台 从而完成前后台数据库的操纵

node特点

单线程

就是每个用户连接的时候 都会使用一个进程 所有的操作都在这一个进程中继续流动

单线程可以把计算机的硬件利用率达到100% 不会造成浪费

非阻塞式io

node在访问高io的情况下 不会进行等待 而是继续向下执行

事件驱动

他会把高io的程序移动到一个事件列队中 等待完成在放到主进程中

node怎么运行

node就是一个js的运行环境 那么我们怎么使用node来运行js?

使用node 你要运行的文件即可

后台与前台

前端:数据展示

后端:数据处理

后台服务器的创建—express

express是什么

express是一个企业级node框架 通过它可以非常方便的进行http服务器的创建 减少我们在创建服务器的时候代码量 因为express中封装了大量用于http的相关方法 我们可以直接使用express来高效的创建一个http服务

1.下载 npm install –save express

使用express来创建基本的api接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 1.引用express
// 在node中引用模块我们需要使用commentjs模块化进行引用
let express=require("express")
// 2.把express方法创建出来并且赋值给一个数据方便使用
const app=express()
// 3.开始创建对应的api接口
// api接口的时候 接口有很多中访问方式 get post 等等方式

// app.get("接口名随便写",(req 请求,res 相应)=>{
// 编写你后台的逻辑
// })
app.get("/user_list/adduser",(req,res)=>{
// 后台就是给前台提供数据的 我怎么把数据给前台呢?
let data=[
{name:"xiaoyang1",age:181},
{name:"xiaoyang2",age:182},
{name:"xiaoyang3",age:183},
{name:"xiaoyang4",age:184}
]

// 相应给前台数据send()把其中的内容返回给前台
res.send({msg:"我是测试接口",datalist:data})
})


// 4.不要忘了设置端口
app.listen(4567)

创建多个接口

今后一个项目肯定有多个接口 登录接口 注册接口 首页列表展示接口 用户权限修改接口 用户信息删除接口 等等等 要有好多个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 1.引用express
// 在node中引用模块我们需要使用commentjs模块化进行引用
let express=require("express")
// 2.把express方法创建出来并且赋值给一个数据方便使用
const app=express()
// 3.开始创建对应的api接口
// api接口的时候 接口有很多中访问方式 get post 等等方式

// app.get("接口名随便写",(req 请求,res 相应)=>{
// 编写你后台的逻辑
// })
app.get("/user_list/adduser",(req,res)=>{
// 后台就是给前台提供数据的 我怎么把数据给前台呢?
let data=[
{name:"xiaoyang1",age:181},
{name:"xiaoyang2",age:182},
{name:"xiaoyang3",age:183},
{name:"xiaoyang4",age:184}
]

// 相应给前台数据send()把其中的内容返回给前台
res.send({msg:"我是测试接口",datalist:data})
})


// 创建第二个
app.get("/user_list/two",(req,res)=>{
res.send({msg:"我是第二个接口"})
})
// 创建第3个
app.get("/user_list/three",(req,res)=>{
res.send({msg:"我是第3个接口"})
})


// 4.不要忘了设置端口
app.listen(4567)

其他方式接口创建

post创建

只是把上面的get()变成post()即可

1
2
3
4
5
// 编写post接口
app.post("/user_list/post",(req,res)=>{
res.send({msg:"我是post接口"})
})

问题

大家发现刚才我们使用get创建的接口 我把地址放到浏览器上面就直接可以访问到 但是post接口却访问不到

引用post接口不能使用浏览器进行直接的测试

那么我们今后写的post接口怎么测试呀 我怎么之后到我写的对不对

接口测试工具–postman

今后在工作的时候 后台不需要我们写 那么今后工作的时候 后台给你了一个接口让你调用 你调不通 谁的错?

在这个时候 我们就可以使用这个接口测试工具测试下后台给你的接口 测通了 我们调用不通就是我们的问题

但是测试不通 那就是后台的问题 你要去找后台

数据库–mongodb

1

mongodb的基本概念

是一个非关系型数据库(NoSql数据库 Not Only Sql 不仅仅是sql)

传统的数据库在应付现在的网站的时候 其实优点力不从心了(当下的网站讲究 海量数据高效存储 高并发)

对于高并发 高效率的数据库需求 油然而生 非关系型数据库 就出现了 解决了对于数据高效处理的问题

因为mongodb存储的就是json 所以我们可以直接把数据库拿出来的数据 返回给前台直接展示

名词叫法:

关系型数据库 mognodb
集合 collection
字段 文档 document

数据库类型分类

非关系型数据库 mongodb redis

关系型数据库 mySql Oracle (甲骨文) SQL server (微软) DB2 (IBM)

mognodb安装

node连接mongodb并且进行操纵—mongoose

mongoose是什么?

就是一个第三方库 通过这个第三方库可以很方便的进行node对mongodb的连接

mongoose操纵mongodb

1.下载mongoose npm install –save mongoose@5

2.在后台新建一个文件db.js(文件名随便起)用来存储连接数据库的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 开始编写连接数据库的模块代码
// 1.先引用
let mongoose=require("mongoose");
// 2.开始连接
// mongoose.connect('mongodb://localhost/你要连接的数据库');
mongoose.connect('mongodb://localhost/xiaoyang',{ useNewUrlParser: true ,useUnifiedTopology: true});
// 3.开始连接
var db = mongoose.connection;
// 4.监听连接成功和失败的状态
db.on('error', console.error.bind(console, '连接失败了'));
db.once('open', function() {
console.log("连接成功了")
});
// 5.设置schema对象---》数据库操纵对象 就是在其中包含了你要操纵的数据
// 与数据类型
var userSchema = mongoose.Schema({
// 你要操纵的数据的key:数据类型
name:String,
age:String
});

// 6.开始连接指定的集合
// var userModel = mongoose.model("集合的名字(就是你的表名)", 数据库操纵对象的名字);
这里会有问题
var userModel = mongoose.model('demo', userSchema);

// 7 暴露数据库连接
// ex6模块化 才是export default的暴露
// 我们在这个里面要使用node模块化 所以暴露应该是 module.exports
module.exports= userModel

3.就可以在对应的接口中去使用这个数据库连接对象 并且对数据库进行 增 删 改 查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let express=require("express")
let app=express()

// 1.引用
let db=require("./db.js")

app.get("/demoa",(req,res)=>{
// 使用数据库连接
db

res.send({msg:"我是测试数据库连接的第一个接口"})
})
app.get("/demob",(req,res)=>{
res.send({msg:"我是测试数据库连接的第2个接口"})
})
app.get("/democ",(req,res)=>{
res.send({msg:"我是测试数据库连接的第3个接口"})
})

app.listen(6666)

但是大家会发现我们在控制台报了一个警告

1
2
3
(node:19084) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:19084) [MONGODB DRIVER] Warning: Current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.

这个警告其实就是提醒我们 你要设置连接模式的 你没有设置 所以我们给你提醒一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
let express=require("express")
let app=express()

// 1.引用
let db=require("./db.js")

app.get("/demoa",(req,res)=>{
// 新增操纵
// 1.设置新增数据
let add=new db({
// 你要新增的数据 必须是在数据库连接的文件中配置过得
name:"xiaoyang1x",
age:"181"
})
// 2.开始存
add.save().then((ok)=>{
console.log(ok)
})

res.send({msg:"我是新增的接口"})
})
app.get("/demob",(req,res)=>{
res.send({msg:"我是查询的接口"})
})
app.get("/democ",(req,res)=>{
res.send({msg:"我是修改接口"})
})
app.get("/demod",(req,res)=>{
res.send({msg:"我是删除接口"})
})

app.listen(8888)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
let express = require("express")
const { find } = require("./db.js")
let app = express()

// 1.引用
let db = require("./db.js")

app.get("/demoa", (req, res) => {
// 新增操纵
// 1.设置新增数据
let add = new db({
// 你要新增的数据 必须是在数据库连接的文件中配置过得
name: "xiaoyang1x",
age: "181"
})
// 2.开始存 save()就是存储的方法
add.save().then((ok) => {
console.log(ok)
})

res.send({ msg: "我是新增的接口" })
})
app.get("/demob", (req, res) => {

// 查询
// find() 就是全部查询
// db.find().then((ok) => {
// console.log(ok)

// res.send({ msg: "我是查询的接口",data:ok })
// })
// 条件查询 秩序要把你的条件放到find的方法里面即可
db.find({name:"xiaoyangx"}).then((ok) => {
console.log(ok)

res.send({ msg: "我是查询的接口",data:ok })
})


})
app.get("/democ", (req, res) => {
res.send({ msg: "我是修改接口" })
})
app.get("/demod", (req, res) => {
res.send({ msg: "我是删除接口" })
})

app.listen(8888)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
let express = require("express")
const { find } = require("./db.js")
let app = express()

// 1.引用
let db = require("./db.js")

app.get("/demoa", (req, res) => {
// 新增操纵
// 1.设置新增数据
let add = new db({
// 你要新增的数据 必须是在数据库连接的文件中配置过得
name: "xiaoyang1x",
age: "181"
})
// 2.开始存 save()就是存储的方法
add.save().then((ok) => {
console.log(ok)
})

res.send({ msg: "我是新增的接口" })
})
app.get("/demob", (req, res) => {

// 查询
// find() 就是全部查询
// db.find().then((ok) => {
// console.log(ok)

// res.send({ msg: "我是查询的接口",data:ok })
// })
// 条件查询 秩序要把你的条件放到find的方法里面即可
db.find({name:"xiaoyangx"}).then((ok) => {
console.log(ok)

res.send({ msg: "我是查询的接口",data:ok })
})


})
app.get("/democ", (req, res) => {
// 修改 update
// db.update({你要修改谁的key:修改的值},{$set:{修改成什么key:修改成什么的val}})
db.update({age:"181"},{$set:{age:"666"}}).then((ok)=>{
console.log(ok)
})
res.send({ msg: "我是修改接口" })
})
app.get("/demod", (req, res) => {
res.send({ msg: "我是删除接口" })
})

app.listen(8888)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
let express = require("express")
const { find } = require("./db.js")
let app = express()

// 1.引用
let db = require("./db.js")

app.get("/demoa", (req, res) => {
// 新增操纵
// 1.设置新增数据
let add = new db({
// 你要新增的数据 必须是在数据库连接的文件中配置过得
name: "xiaoyang1x",
age: "181"
})
// 2.开始存 save()就是存储的方法
add.save().then((ok) => {
console.log(ok)
})

res.send({ msg: "我是新增的接口" })
})
app.get("/demob", (req, res) => {

// 查询
// find() 就是全部查询
// db.find().then((ok) => {
// console.log(ok)

// res.send({ msg: "我是查询的接口",data:ok })
// })
// 条件查询 秩序要把你的条件放到find的方法里面即可
db.find({name:"xiaoyangx"}).then((ok) => {
console.log(ok)

res.send({ msg: "我是查询的接口",data:ok })
})


})
app.get("/democ", (req, res) => {
// 修改 update
// db.update({你要修改谁的key:修改的值},{$set:{修改成什么key:修改成什么的val}})
db.update({age:"181"},{$set:{age:"666"}}).then((ok)=>{
console.log(ok)
})
res.send({ msg: "我是修改接口" })
})
app.get("/demod", (req, res) => {

// 删除使用remove
// db.remove({你要删除的key:你要删除的val})
db.remove({age:"666"}).then((ok)=>{
console.log(ok)
})
res.send({ msg: "我是删除接口" })
})

app.listen(8888)

前后台交互—get

前台部分—vue–发送数据

axios发送get数据 使用params来进行发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import service from "@/util/service.js"

let link=(url,params)=>{
return new Promise((resolve,reject)=>{
service.request({
url,
method:"get",
// 发送get数据使用 params
// params:{你要发送的key:你要发送的value}
params
}).then((ok)=>{
resolve(ok)
}).catch((err)=>{
reject(err)
})
})
}

export default link

后台部分—node–接收数据

后台接收数据使用req.query.xxx 来进行接收前端发送过来的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
app.get("/demoa", (req, res) => {
// 接收前端发送过来的get数据
console.log(req.query.nameData+"-----"+req.query.ageDate)

// 新增操纵
// 1.设置新增数据
let add = new db({
// 你要新增的数据 必须是在数据库连接的文件中配置过得
name: "xiaoyang1x",
age: "181"
})
// 2.开始存 save()就是存储的方法
add.save().then((ok) => {
console.log(ok)
})

res.send({ msg: "我是新增的接口" })
})

前后台交互—post

上面的get部分很简单 但是post前后台都很麻烦

前台部分—vue–发送数据

post发送数据使用body

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import service from "@/util/service.js"

let link=(url,method,params,body)=>{
return new Promise((resolve,reject)=>{
service.request({
url,
method,
// 发送get数据使用 params
// params:{你要发送的key:你要发送的value}
params,
// 发送post使用body
body
}).then((ok)=>{
resolve(ok)
}).catch((err)=>{
reject(err)
})
})
}

export default link

我们如果直接给body传递数据的话 后台是接不到的 因为axios没有办法帮我们去解析post的数据 所以我们需要对数据进行转换 在发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<template>
<div>
<h1>发送post</h1>
姓名<input type="text" v-model="inputaval" />
年龄<input type="text" v-model="inputbval"/>
<button @click="fun()">点我发送请求给后台</button>
</div>
</template>

<script>
import link from "@/api/api.js"
export default {

data() {
return {
inputaval: "",
inputbval: "",
};
},
methods: {
fun() {
// post不能直接发送需要转换才能发送 要不然后端接收不到数据
let usp = new URLSearchParams()
// usp.append("你发送数据的key","你发送数据的val")
usp.append("nameData",this.inputaval)
usp.append("ageData",this.inputbval)

link("/api/xxx","post",{},usp).then((ok)=>{
cosnole.log(ok)
})
},
},
};
</script>

<style>
</style>

后台部分—node–接收数据

1.因为node也不会解析post 所以我们需要使用一个插件叫做body-parser来帮助我们接收

npm install –save body-parser