node.js笔录

1.node.js的异步I/O;

   只启用一个线程来运行用户的代码,等到耗时的I/O(输入输出时,),会丢到底层事件循环去处理,继续执行下一I/O.等后边的事件执行完毕之后,给一个回调函数(callbreak).提示.

   打比方::就像大家去银行办事,一种是阻塞同步表现,办理一个人业务在办理一个人,,,,另一种就像node.js一样,先去刷号,然后可以自由等待,等到叫号码就处理,不耽误自己时间.而银行工作人员就是底层事件循环..

2.node.js为什么能做后端:

  •  可以访问文件;
  1.  var fs = require('fs');//调用fs函数库 //参数1 文件的名字,参数2 编码格式 参数3 回调函数   fs.readFile('f.txt','utf-8',(err,data)=>{ if(err){ console.error(err); }else{ console.log(data); } })
  2. 异步请求     var fs = require('fs'); var data = fs.readFileSync('f.txt','utf-8'); console.log(data);
  3. 回调函数     

    function readFileCallBack(err,data){

    if(err){
    console.error(err);
    }else{
    console.log(data);
    }
    }

    var fs = require('fs');
    var data = fs.readFile('f.txt','utf-8',readFileCallBack);
    console.log(data);

3.node.js创建服务器,完整版

<1>服务器

  

const express = require('express')
const app = express()

// 注册 body-parser 中间件
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))

// 在 API 服务器端,启用 CORS 跨域资源共享
const cors = require('cors')
app.use(cors())

// 导入自己的路由模块
const router = require('./router.js')
// 注册路由模块
app.use(router)

// 让 后端项目,运行在 5001 端口
app.listen(5001, () => {
console.log('api server running at http://127.0.0.1:5001')
})

 

<2>路由

// 路由模块 本质:就是 URL 地址到 处理函数之间的对应关系
const express = require('express')
const router = express.Router()

// 导入自己的 业务逻辑处理模块
const ctrl = require('./controller.js')

// 只要有人请求 后台的 / 根路径地址,就提示他,请求API服务器成功了!
router.get('/', ctrl.testAPI)

// 对外暴露 getAllHero 接口
router.get('/getallhero', ctrl.getAllHero)

// 对外暴露添加英雄的API接口
router.post('/addhero', ctrl.addHero)

// 对外暴露 获取英雄信息的 API 接口
router.get('/gethero/:id', ctrl.getHeroById)

// 对外暴露 根据Id更新英雄数据的API接口
router.post('/updatehero/:id', ctrl.updateHeroById)

// 对外暴露 根据Id软删除英雄数据的API接口
router.get('/deletehero/:id', ctrl.deleteHeroById)

module.exports = router

<3>

// 业务处理模块

const conn = require('./db.js')

module.exports = {
// 测试 API 服务器能否正常被请求
testAPI: (req, res) => {
res.send('请求后台API接口成功!')
},
// 获取所有英雄列表
getAllHero: (req, res) => {
const sql = 'select * from heros'
conn.query(sql, (err, result) => {
// 如果读取数据失败,则返回一个失败的结果
if (err) return res.send({ status: 500, msg: err.message, data: null })
// 如果获取数据成功,则直接返回成功的数据结果
res.send({ status: 200, msg: 'ok', data: result })
})
},
// 添加英雄
addHero: (req, res) => {
// 1. 获取到客户端提交到 服务器的 表单数据
// 获取到 客户端提交过来的 英雄名称、性别 即可
// 获取服务器的当前时间,当作 英雄的添加时间
const hero = req.body
// 得到当前的时间对象
const dt = new Date()

// 字符串,有一个新方法,叫做 padStart(长度, 要填充的字符串)
const y = dt.getFullYear()
const m = (dt.getMonth() + 1).toString().padStart(2, '0')
const d = dt
.getDate()
.toString()
.padStart(2, '0')

const hh = dt
.getHours()
.toString()
.padStart(2, '0')
const mm = dt
.getMinutes()
.toString()
.padStart(2, '0')
const ss = dt
.getSeconds()
.toString()
.padStart(2, '0')
// 补全英雄的添加时间
hero.ctime = y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss

// 调用 conn.query 实现 添加英雄
const sql = 'insert into heros set ?'
conn.query(sql, hero, (err, result) => {
if (err) return res.send({ status: 500, msg: err.message, data: null })
res.send({ status: 200, msg: 'ok', data: null })
})
},
// 根据Id获取英雄信息
getHeroById: (req, res) => {
// 1. 获取到英雄的Id
// 2. 根据Id查询数据,并返回给客户端查询的结果
const id = req.params.id
const sql = 'select * from heros where id=?'
conn.query(sql, id, (err, result) => {
if (err) return res.send({ status: 500, msg: err.message, data: null })
res.send({ status: 200, msg: 'ok', data: result })
})
},
// 根据 Id 更新英雄信息
updateHeroById: (req, res) => {
const id = req.params.id
const newInfo = req.body
const sql = 'update heros set ? where id=?'
conn.query(sql, [newInfo, id], (err, result) => {
if (err) return res.send({ status: 500, msg: err.message, data: null })
res.send({ status: 200, msg: 'ok', data: null })
})
},
// 根据Id删除英雄信息
deleteHeroById: (req, res) => {
const id = req.params.id
const sql = 'update heros set isdel=1 where id=?'
conn.query(sql, id, (err, result) => {
if (err) return res.send({ status: 500, msg: err.message, data: null })
res.send({ status: 200, msg: 'ok', data: null })
})
}
}

<4>

// 这是 数据操作模块,只负责 获取数据库连接对象

// 导入 mysql 模块
const mysql = require('mysql')
// 创建数据库连接
const conn = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'mysql_001'
})

module.exports = conn

 

 

4. Express 框架中对中间件的5种分类

  1. 应用级别的中间件: 挂载到 app 上的中间件 app.get('URL地址', (req, res, next)=> {})

  2. 路由级别的中间件: 挂载到 router 对象上的中间件 router.get('url地址', (req, res, next)=>{})

  3. 错误级别的中间件: 回调函数中,有四个参数 app.use((err, req, res, next)=>{})

  4. 唯一内置的中间件: express.static()

  5. 第三方中间件: 非express框架提供的,需要程序员手动安装才能使用的中间件;body-parser 解析post 表单数据

posted @ 2019-01-05 21:55  水滴007  阅读(194)  评论(0)    收藏  举报