第二门 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('

hello world

') }) 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中是回调函数

开发接口

初始化路由
返回假数据

你可能感兴趣的:(第二门 Node)