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
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变量。
- 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)
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
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)
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);
控制台中
路由
/内容就可以代表一个路由
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);
综合示例
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方式
post方式
搭建开发环境
从0开始,不使用框架
使用nodemon检测文件变化,自动重启node
使用cross-env设置环境变量,兼容mac linux 和windows
建立文件夹blog1
node版本要>=8
npm init -y初始化package.json
修改main主入口文件地址bin/www.js
在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"
运行
npm run dev
修改json数据监测nodemon是否正常使用
progress.env获取环境变量
const resData={
name:'zhang01',
site:'imooc',
// 获取环境变量
env:process.env.NODE_ENV
}
两个文件分离
www.js中是基础功能
app.js中是回调函数
开发接口
初始化路由
返回假数据