You辉编程_NodeJS&Koa2服务端开发

##Nodejs基础
1.npm是什么:用来管理ndejs软件包
2.使用npm安装软件包:npm 会随着nodejs一起安装
npm init初始化环境
(1)npm install lodash --save 安装lodash(js的实用工具库)
//引入lodash
const _ = require('lodash');
const arr = [1,2,3]
const otherArr = _.concat(arr,4,5)
console.log(otherArr) //[1,2,3,4,5]

(2)npm install nodemon --save-dev 安装nodemon,用来启动服务器,保证在修改代码时自动重新启动服务器
--save和--save-dev的区别
--save安装后会在"dependencie":{"lodash:^4.17.15"}  可以在代码中直接引用
--save-dev安装后会在"devdependencies":{"nodemon":"^2.0.2"} 不可以在代码中直接引用
3.关于package.json:一些配置信息
4.commonjs模块化
(1)commonjs语法介绍
# module.exports 导出
# require() 引用(入)
# 主要用于nodejs开发
# require()的三个层级
-系统自带模块,如require('http'); const http = require('http'); //nodejs自带的模块
-npm包,如 require('lodash'); const _ = require('lodash'); //通过npm安装的模块
-自定义模块,如 require('a'); const {sum,test} = require('./utils'); //自己定义的模块
-eg
-utils.js 
function sum (a,b) {
    return a + b
}
function test(){
    console.log('this is test')
}
//导出
module.exprots = {sum,test}
-index.js
//引入(解构)
const {sum,test} = require(./utils)
const res = sum(10,20)
test()
console.log(res);
(2)commonjs和ES6 Module的区别
# 语法不一样
# commonjs是执行时(用到时程序才开始执行)引入,动态的
# ES6 Module是打包时(引入时)引入,静态的
回顾ES6Module
exprot...(分别导出)或 exprot default...
import...from
一般用于VUE前端开发
(3)为何要使用模块化

5.nodejs debug
(1)inspect(检查)调试法 打断点 dubugger
# 修改scripts,增加——inspect,启动服务器
# 打开chrome,访问chrome://inspect 
# 增加debugger,重启服务,即可调试

6.nodejs 和 js区别
(1)两者都使用js语法
(2)前端js使用浏览器提供的Web API
# Web API 如前端的DOM,BOM,事件,Aajx等
(3)nodejs使用nodejs API 
# 如http

######Nodejs处理HTTP
1.认识req和res
(1)nodejs如何监听http请求
const http = require('http')
//创建服务
const server = http.createServe(() =>{
    console.log('已经收到http请求')
})
server.listen(3000) //可以监听http请求
console.log('http 请求已经被监听,3000端口')
(2)如何拿到req和res
const http = require('http')
//创建服务
const server = http.createServe((req,res) =>{
    const url = req.url;//获取请求url
    console.log('url is:',url)
    res.end('已经收到请求,已经返回数据');//res返回信息给前端json格式
})
server.listen(3000) //可以监听http请求
console.log('http 请求已经被监听,3000端口')
(3)如何使用req和res
2.nodejs启动Web服务
(1)使用Http模块,启动服务
(2)本机IP 127.0.0.1 域名是localhost

3.路由包含什么 路由:和前端约定的服务端的入口规则,路由是规则,url是具体形式
(1)定义method,如GET/POST等
(2)定义url规则,如/api/list和/api/create 
(3)定义输入(Request body)和输出(Response body)格式
补:前端Ajax时需要url
function getUserAccount(){
    return axios.get('/user/12345')
}
function getUserPermissions(){
    return axios.get('user'/12345/permissions)
}
4.定义一个get路由
const http = require('http');
const serve = http.createServer((req,res)=>{
    const url = req.url;
    conso modthod = req.method;
    console.log(url);
    console.log(modthod)
    //定义路由,模拟获取留言板列表
    if(url === '/api/list' && method === 'GET'){
        res.end('this is list router')
    }
})

const.listen(3000)

##测试路由
#GET请求,直接用浏览器访问
#POST请求,需要借助工具——postman

5.querystring
(1)什么时querystring
# http://xxx.com/list.html?keyword=nba&lang=en&a=100
# url问号后面的都是querystring(也叫url参数)
# &分割,key=value形式,可以继续扩展
# querystring(参数):是动态网页的基石,通过不同的参数返回不同页面及内容
(2)nodejs获取querystring
const http = require('http');
const serve = http.createServe((req,res)=>{
   const url = req.url;
   const quertStr = url.split('?')[1] /a=100&b=200
   //解析queryString
   const query = {}
   queryStr.split('&'),forEach(item=>{
       //item:即a=100的形式
       const key = item.split('=')[0] //a 
       const val = item.split('=')[1] //100
       query[key] = val //{a:'100',b:'200'}
   })
   console.log(query)
})
serve.listen(3000)

hash:
htpp://xxx/com/index.html/#/home
#号后的部分就是hash,hash是不能让服务端获取的。
(3)querystring-论结构化与非结构化
# 结构化的数据,易于通过程序访问和分析,如对象和数据
# 非结构化的数据,不易通过程序分析,如字符串
# 编程中尽量使用结构化数据

综合:
const http = require('http');
//querystring解析除了下面的法一之外,还可以导入模块解决
const querystring = require('querystring');
//使用http模块启动Web Server
const server = http.createServer((req,res) =>{
    //http.createServe:只有前端访问了才会返回数据
    //console.log('后端已经收到前端http请求');
    //res.end('this is server content');//返回信息给前端
    //const url = req.url;//http://localhost:3000/index.html  url:/index
    //console.log(url);//   /:斜线就是url /favicon.ico是:小图标


    /*#####################路由########################*/
    const url = req.url;
    //防止路由后有请求参数,导致与定义的路由不符
    const path = url.split('?')[0]; //以?号作为分隔符,取?号前面的部分,即使请求有参数也不影响  /api/list?a=100&b=200
    const queryStr = url.split('?')[1]; //  url:http://localhost:3000/api/list?filterType=1
    //解析querystring 法二
    const query  = querystring.parse(queryStr || '');
    console.log(query); //{filterType:'2'}
    //解析querystring 法一
    // const query = {};
    // if(queryStr){
    //     queryStr.split('&').forEach(item =>{
    //         //item即a=100的形式
    //         const key = item.split('=')[0];// 'a'
    //         const value = item.split('=')[1];// '100'
    //         //把key和value放到query中
    //         query[key] = value; 
    //     })
    //     //console.log(query);//{a:'100',b:'200'}
    // }
    
    const method = req.method;
    //console.log('methods is :',method);
    //res.end('url and method test');
    //定义路由GET(即定义一个规则):模拟获取留言板列表
    // if(path === '/api/list' && method === 'GET'){
    //     //如果符合条件就可以进入路由
    //     res.end('this is true list router');
    // }else{
    //     res.end('404');
    // }

    //定义路由POST:模拟 创建列表
    // if(path === '/api/create' && method === 'POST'){
    //     res.end('this is create router');
    // }else{
    //     res.end('404');
    // }


    /*#######################querystring(参数)################################*/
    if(path === '/api/list' && method === 'GET'){
        if(query.filterType === '1'){
            res.end('this is list router,all')
        }
        if(query.filterType === '2'){
            res.end('this is list router,only mine')
        }
       // res.end('this is true list router');
    }else{
        res.end('404');
    }

})
server.listen(3000);
console.log('服务器已经启动');


(4)使用res返回数据
# 使用res设置返回的状态码,Content-type,body
# 如何返回JSON数据
 if(path === '/api/list' && method === 'GET'){
        //返回JSON格式的数据
        res.writeHead(200,{'Content-type':'application/json'});
        const result = {
            errno:0,
            data:[
                {user:'zhansan',content:'留言1'},
                {user:'lisi',content:'留言2'}
            ]
        }
        res.end(JSON.stringify(result));
    }else{
        //res.end('404');
        res.writeHead(404,{'Content-type':'text/plain'});
        res.end('404 Not Found');
    }

# 如何返回html
-Content-type:text/html
-res.end(...)
-浏览器会根据Content-type识别出html格式

(5)获取Request Body 
# 流(stream):像水的流动
-流的表现
观看视频时,一边加载一边观看
上传文件时,有进度条
网速慢时,打开网页会先显示一部分,然后继续加载

===========================================

Koa2

1.koa2介绍
# 什么是框架
-封装原生代码的API
-规范流程和格式
-让开发人员更加关注于业务代码,提高开发效率
# 框架(frame)和库(lib)的区别
-框架是唯一的(只能用一个),库就可以共存(可以用多个库)
-框架更注重流程,库只注重单个功能
# koa2是nodejs web server框架
-官网和文档https://koa.bootcss.com/
-通过async/await语法高效编写web server 
-中间件机制,能合理拆分业务代码
# koa的安装和基本使用
-初始化 npm init 
-安装 npm install koa2 --save 
-基本使用

2.koa2环境搭建
# 使用脚手架 koa-generator 创建koa2项目 安装:npm install -g koa-generator
# 介绍项目的目录和文件
# 在项目中新建一个路由

3.koa2处理http请求
# 如何接收数和返回数据
# 重写:模拟留言的两个路由
# ctx即 res和req的集合
# querystring和Request body
# Response body和 Content-type

=================================

做koa2项目就按这个初始化你的项目

# 初始化koa2环境

-安装脚手架: npm install -g koa-generator

-项目命名并生成环境: koa2 messageitem

-进入项目: cd Item

-安装所有依赖文件: npm install

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值