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 let express=require ("express" )const app=express () 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 } ] res.send ({msg :"我是测试接口" ,datalist :data}) }) 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 let express=require ("express" )const app=express () 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 } ] res.send ({msg :"我是测试接口" ,datalist :data}) }) app.get ("/user_list/two" ,(req,res )=> { res.send ({msg :"我是第二个接口" }) }) app.get ("/user_list/three" ,(req,res )=> { res.send ({msg :"我是第3个接口" }) }) app.listen (4567 )
其他方式接口创建 post创建
只是把上面的get()变成post()即可
1 2 3 4 5 app.post ("/user_list/post" ,(req,res )=> { res.send ({msg :"我是post接口" }) })
问题 大家发现刚才我们使用get创建的接口 我把地址放到浏览器上面就直接可以访问到 但是post接口却访问不到
引用post接口不能使用浏览器进行直接的测试
那么我们今后写的post接口怎么测试呀 我怎么之后到我写的对不对
接口测试工具–postman 今后在工作的时候 后台不需要我们写 那么今后工作的时候 后台给你了一个接口让你调用 你调不通 谁的错?
在这个时候 我们就可以使用这个接口测试工具测试下后台给你的接口 测通了 我们调用不通就是我们的问题
但是测试不通 那就是后台的问题 你要去找后台
数据库–mongodb
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 let mongoose=require ("mongoose" );mongoose.connect ('mongodb://localhost/xiaoyang' ,{ useNewUrlParser : true ,useUnifiedTopology : true }); var db = mongoose.connection ;db.on ('error' , console .error .bind (console , '连接失败了' )); db.once ('open' , function ( ) { console .log ("连接成功了" ) }); var userSchema = mongoose.Schema ({ name :String , age :String }); 这里会有问题 var userModel = mongoose.model ('demo' , userSchema);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 ()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 ()let db=require ("./db.js" )app.get ("/demoa" ,(req,res )=> { let add=new db ({ name :"xiaoyang1x" , age :"181" }) 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 ()let db = require ("./db.js" )app.get ("/demoa" , (req, res ) => { let add = new db ({ name : "xiaoyang1x" , age : "181" }) add.save ().then ((ok ) => { console .log (ok) }) res.send ({ msg : "我是新增的接口" }) }) app.get ("/demob" , (req, res ) => { 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 ()let db = require ("./db.js" )app.get ("/demoa" , (req, res ) => { let add = new db ({ name : "xiaoyang1x" , age : "181" }) add.save ().then ((ok ) => { console .log (ok) }) res.send ({ msg : "我是新增的接口" }) }) app.get ("/demob" , (req, res ) => { db.find ({name :"xiaoyangx" }).then ((ok ) => { console .log (ok) res.send ({ msg : "我是查询的接口" ,data :ok }) }) }) app.get ("/democ" , (req, res ) => { 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 ()let db = require ("./db.js" )app.get ("/demoa" , (req, res ) => { let add = new db ({ name : "xiaoyang1x" , age : "181" }) add.save ().then ((ok ) => { console .log (ok) }) res.send ({ msg : "我是新增的接口" }) }) app.get ("/demob" , (req, res ) => { db.find ({name :"xiaoyangx" }).then ((ok ) => { console .log (ok) res.send ({ msg : "我是查询的接口" ,data :ok }) }) }) app.get ("/democ" , (req, res ) => { db.update ({age :"181" },{$set :{age :"666" }}).then ((ok )=> { console .log (ok) }) res.send ({ msg : "我是修改接口" }) }) app.get ("/demod" , (req, res ) => { 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" , 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 ) => { console .log (req.query .nameData +"-----" +req.query .ageDate ) let add = new db ({ name : "xiaoyang1x" , age : "181" }) 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, params, 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 ( ) { let usp = new URLSearchParams () 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