第二门 Node

nodejs介绍下载

普通方式:

1.官网,下载并安装
2.打开cmd,运行node -v和npm -v

nvm安装:

1.nvm是nodejs版本管理工具,可以切换nodejs版本
2.mac os系统 ,使用brew install nvm(brew是苹果的软件管理工具)
3.windows系统 ,githup中搜索 vnm-windows,有下载地址
https://github.com/coreybutler/nvm-windows

图片.png

图片.png

4.nvm list 查看所有的node版本
5.nvm install v10.13.0 安装指定的版本
6.nvm use-delete-prefix 10.13.0 切换到指定的版本

总结:如果同时使用多个版本,建议使用vnm
必须安装好node,版本>=8.0

ECMAScript:

1、定义了语法,写js和nodejs都需要遵守
2、变量定义,循环,判断,函数
3、原型和原型链,作用域和闭包,异步
阮一峰老师的es6网站
4、不能操作DOM,不能监听事件,不能发送ajax请求
5、不能处理http请求,不能操作文件
6、只有es做不了任何实际的项目

JavaScript:

1、使用了es的语法规范+web API
2、DOM操作,BOM操作,事件绑定,Ajax等
3、两者结合,即可以完成浏览器端的操作

nodejs

1、使用了es语法规范+nodejs API
2、处理http,处理文件,地址http://nodejs.cn/api/
3、两者结合,即可完成server端的任何操作

总结:
es是语法规范
nodejs=es+nodejs API
js =es+js API

common.js 模块化规范

moudle.export()导出
require导入
node 文件运行
node init -y 初始化环境
loadash(工具库)
npm i loadsh --save

引入文件 require

  • 如果有路径就在路径中查找
  • 如果没有路径,就在node_modules中查找
  • 在没有路径,且没有node_modules的时候,会在node的安装目录中查找
(1)如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。

(2)如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。

(3)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
(4)如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require('example-module/path/to/file'),则将先找到example-module的位置,然后再以它为参数,找到后续路径。

(5)如果指定的模块文件没有发现,Node会尝试为文件名添加.js、.json、.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。

(6)如果想得到require命令加载的确切文件名,使用require.resolve()方法。// 该方法使用,可参考[图片上传失败...(image-e91945-1583992859621)]

https://www.jianshu.com/p/e4edf4b08d9e

module对象

  • module.exports 属性。属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports变量。
  1. a.js中声明了add函数,并使用module.exports导出。
//a.js中声明了add函数,并使用module.exports导出。
function add(a,b){
return a +b;
}
module.exports = add;

在b.js中,引入a.js,这里是使用常量接收,然后就可以使用a.js中导出的

// 在b.js中,引入a.js,这里是使用常量接收,然后就可以使用a.js中导出的函数
const add = require('./a');
const sum = add(10,20);
console.log(sum)
image.png

https://upload-images.jianshu.io/upload_images/19813229-e4294cd4d1dda7a9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.若是导出多个,可以选择导出一个对象,例:

// a.js
function add(a,b){
return a +b;
}

function mul(a,b){
return a*b;
}
module.exports = {
add,
mul
};

导入有以下两种方式:
注意:对象形式的导入导出,方法名(也就是add、mul这些导入导出时,名称要保持一致)

// 第一种:
const obj = require('./a');
const sum = obj.add(8,20);
console.log(sum)

// 第二种:
const {add,mul} = require('./a');
const sum = mul(8,20);
console.log(sum)

debugger

主文件入口:main.js

http:自有模块

初始化

npm init -y

创建主入口文件,例如index.js

代码流程:

引入http
创建服务
监听端口

const http = require('http');

const server = http.createServer((req, res) => {
    res.writeHead('200', {
        'content-type': 'text/html'
    })
    res.end('<h1>hello world</h1>')
})
server.listen(3000, () => {
    console.log('listening on 3000 port')
})

cmd 中执行node index.js
在浏览器地址栏中输入localhost:3000

server开发和前端开发

1、服务稳定性:恶意攻击,不能挂掉
2、考虑内存和cpu:客户端独占一个浏览器,内存和cpu;server端承载很多请求,cpu和内存都是稀缺资源;stream写日志,使用radis存储session
3、日志记录:前端是日志发起方;后端要记录日志,存储日志,分析日志
4、安全:越权操作,数据库攻击;验证预防xss攻击和sql入驻
5、集群和服务拆分:流量增加,通过扩展机器和服务拆分承载大流量

http概述

1.nodejs处理http请求
2.搭建开发环境
3.开发接口(暂不连接数据库,暂不考虑登录)

案例:

1.访问baidu
2.到network

图片.png

dns解析:域名对应服务器,解析一个ip地址
Remote Address(远端地址): 61.135.169.121:443
443https的默认端口,http的默认端口是80

客户端找到ip地址之后会进行tcp连接,3次握手
1、客户端询问服务器是否可以使用
2、服务器告诉客户端可用
3、客户端再次告诉服务器可以访问
发送http请求
request 请求
response 响应

get请求和querystring

get请求,即客户端向server端获取数据
通过querystring来传递数据,如a.html?a=100&b=200
浏览器直接访问,就是发送get请求

const http = require('http');
const querystring = require('querystring');

const server = http.createServer((req, res) => {
    console.log('method:' + req.method) //获取请求方式 GET
    const url = req.url //获取请求的完整 url
    console.log('url:', url)
    req.query = querystring.parse(url.split('?')[1]); //解析querystring
    console.log('query:', req.query)

    res.end(JSON.stringify(req.query)); //将querystring返回
})
server.listen(8000)
图片.png

图片.png

post请求和post data

post请求,客户端要向服务端传递数据
通过post data传递数据
浏览器无法直接模拟,手动写js,或者使用postman

安装postman

安装方式:https://www.jianshu.com/p/17da8735866b
使用方式:

const http = require('http');

const server = http.createServer((req, res) => {
    if (req.method === 'POST') {
        // 数据格式
        console.log('contnent-type:', req.headers['content-type'])
    }
    // 接受数据
    let postData = ""
    // 数据流的方式,chunk是传入的每一点数据
    req.on('data', chunk => {
        postData += chunk.toString()
    })
    // 接收完之后触发end事件
    req.on('end', () => {
        console.log(postData)
        res.end('hello world') //在这里返回,因为是异步操作
    })

})
server.listen(8000);
图片.png

控制台中


图片.png

路由

/内容就可以代表一个路由

const http = require('http');

const server = http.createServer((req, res) => {
    const url = req.url
    const path = url.split('?')[0]
    res.end(path)//返回路由

})
server.listen(8000);
图片.png

综合示例

const http = require('http');
const querystring = require('querystring');

const server = http.createServer((req, res) => {
    // 请求方式
    const method = req.method
    // 请求地址
    const url = req.url
    // 路由
    const path = url.split('?')[0]
    // ?后面的内容
    const query = querystring.parse(url.split('?')[1])

    // 设置返回数据为json
    res.setHeader('Content-type', 'application/json')

    // 返回的数据
    const resData = {
        method,
        url,
        path,
        query
    }
    // 返回
    if (method === 'GET') {
        res.end(
            JSON.stringify(resData)
        )
    }
    if (method === 'POST') {
        let postData = ''
        req.on('data', chunk => {
            postData += chunk.toString()
        })
        req.on('end', () => {
            //  将数据添加到结果中
            resData.postData = postData
            //  返回
            res.end(
                JSON.stringify(resData)
            )
        })
    }
})
server.listen(8000)
console.log('ok')

get方式


图片.png

post方式


图片.png

搭建开发环境

从0开始,不使用框架
使用nodemon检测文件变化,自动重启node
使用cross-env设置环境变量,兼容mac linux 和windows

建立文件夹blog1
node版本要>=8
npm init -y初始化package.json
修改main主入口文件地址bin/www.js

图片.png

www.js文件中添加代码

const http = require('http');

const PORT = 8000
const serverHandle = require('../app')

const server = http.createServer(serverHandle)
server.listen(PORT)

创建app.js文件,添加代码

const serverHandle = (req, res) => {
    // 设置返回格式
    res.setHeader('Content-type', 'application/json');

    const resData={
        name:'zhang',
        site:'imooc'
    }
    res.end(
        JSON.stringify(resData)
    )
}
module.exports = serverHandle

运行

node bin/www.js

停止运行,安装nodemon和cross-env

npm install nodemon cross-env --save-dev

在package.json文件的scripts中添加内容
意思是设置环境变量兼容不同系统 以及实时监测www.js文件

"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js"
图片.png

运行

npm run dev
图片.png

修改json数据监测nodemon是否正常使用
progress.env获取环境变量

  const resData={
        name:'zhang01',
        site:'imooc',
        // 获取环境变量
        env:process.env.NODE_ENV
    }
图片.png

图片.png

两个文件分离
www.js中是基础功能
app.js中是回调函数

开发接口

初始化路由
返回假数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容