Node.js
是一个环境,能够让开发者使用Javascript开发服务端功能
历史上第一次一门语言可以通吃前后端
node.js最大的特点: 1、快、非常快 - 以前最快的是php,node.js速度是php的十六倍 2、为什么快:1、因为官方提供的东西少,甚至连数据库API都没有提供过 2、使用了google浏览器的v8引擎
案例:使用bootstrap+jquery+node:图书管理系统
要求:
1、搭建服务器和文件系统 - 别人也能访问你
2、搭配上MySQL数据库(增删改查) - 有的东西是同步的,有的东西是异步的,路由的写法-随意,node.js中所有的src/href/action/location - 都称之为是一个路由请求
1、Node.js概述
不是JS,但是语法和javascript非常相似,他的竞争对手java、php、c#、python...
做的功能绝对不是特效,做的事和服务器端一致(和数据库进行交互)
目的:
1、使用代码搭建一个服务器(服务器文件可以放在任何位置,并且不会安装上一些我不需要的东西)
2、Node.js如何沟通前端与数据库
2、Node.js安装
node-v12.1.0-x64.msi - 一路往下点,哪里点不动了,就把那里勾上,不要取消任何东西
版本:16年初(0.12) 16年中(4.xx) 16年末(6.xx) - 更新速度很快,意味着:发展迅速,其实也没加什么新东西,就是一些不好的方法更新了一下
检查:打开cmd输入:node -v - 查看版本号,如果有版本号说明已经安装成功
其实我们安装的这个node.js就是一个运行环境而已,不需要浏览器了
3、Node.js如何运行
1、交互模式 - 临时测试
打开cmd输入:node回车,就可以开始敲你的"js"代码了
2、脚本/文件模式 - 正式开发中
1、先创建xx.js:里面书写自己的代码
2、打开cmd输入:node 文件绝对路径
3、编辑器有插件:
1、vscode:code runner - 文件代码处右键
2、HBuilder:nodeeclipse - 右键运行
插件想要成功,必须保证前两个cmd方式能用
4、Node.js的知识
(1)、js 和 node的区别
相同点:都可以使用一切的ECMAScript的一切API都可以使用,放心大胆的用,在服务器端不存在浏览器,就不会有任何兼容问题
不同点:1、javascript:DOM+BOM - 做特效
2、Node.js:虽然不能用DOM+BOM,但是他却有10万个以上的模块(新增了一些只适合服务器环境的语法),http、fs、path、url
(2)、模块:每一个.js文件,都可以称之为是一个模块
1、模块化开发:如果以一个网站来说,我们可以按照功能分为很多模块:商家模块、产品模块、促销模块、用户模块、商品模块...
分工合作:将每个模块交给对应的人完成,最后再由【主模块】进行引入:
1、每一个模块都有一个操作,可以用于公开/暴露自己的成员
1、exports.属性名=值;
2、module.exports={
属性名: 值,
...
}
2、每一个模块都有一个操作,可以用于引入其他模块
var xxx=require("./文件名"); //引入时的./不能省略
鄙视题:exports和module.exports有什么区别?
都是用于暴露公开自己的成员的
但是:exports={}; 写法是错误的
node.js底层有一句话:exports=module.exports;
其实真正做公开功能的是module.exports
如果你使用了 exports={};覆盖了module.exports,不在具有公开功能
(3)、模块的分类
【1】、官方模块 -大概了几十个,重要的只有几个
不需要下载,在你安装node.js环境的就已经带上了,但是某得模块可能需要引入,某得模块不需要引入
1、Global模块:
不需要引入,直接可以使用
提供:
1、三种定时器(Interval、Timeout、Immediate) - 其实这些定时器也不是曾经的定时器了,功能和以前一样
Immediate 底层:Timeout延时为0,但是毕竟是异步操作,不会卡住后续代码
2、console控制台
3、提供了5个变量给我们,可以直接使用:
1、*exports - 公开/暴露自己的成员
2、*require - 引入其他模块的
3、__filename - 获取当前文件完整的绝对路径
4、*__dirname - 获取当前文件绝对路径,不包含此文件的名字:何时:vscode某的同学可能不支持在node.js书写相对路径,只能写绝对路径
5、*module - 指代当前模块本身
2、querystring模块:查询字符串
需要引入:var qs=require("querystring");
提供了解析url查询字符串部分的功能
var obj=qs.parse("查询字符串")
想要获取前端传来的每一部分:obj.键名;
垃圾:如果前端传来的是一个完整的url网址,他就解析不了了
3、url模块 - 小重点
需要引入:var url=require("url");
提供了解析url各个部分的功能
var obj=url.parse("网址",true);//支持第二个参数,是一个布尔值,默认为false,一旦设置为true,自动使用querystring模块的parse方法,解析查询字符串
真正的重点:
1、查询字符串:obj.query.键名; - 拿到前端传到后端的东西
2、路由/请求地址:obj.pathname; - 判断路由的不同,去读取不同的HTML发送给用户看
4、Buffer模块:缓冲区,可以将数据变成一个16进制的数字
不需要我们去引入,直接可以使用
我们绝对不会主动使用buffer的任何操作,但是后面的一些API可能会导致我们得到的结果直接就是一个buffer结果,而且有的API还就支持buffer操作
5、fs模块 - 大重点:文件系统:用代码对文件进行增删改查
需要引入:var fs=require("fs");
*异步读取文件:fs.readFile("文件路径",(err,buf)=>{
buf->读取到的内容
})
异步写入文件:fs.writeFile("文件路径","新内容",(err)=>{ - 会替换掉原有的内容
//执行写入完毕后要做的操作
})
异步追加文件:fs.appendFile("文件路径","新内容",(err)=>{ - 会替换掉原有的内容
//执行写入完毕后要做的操作
})
6、http模块 - 超级重点:搭建服务器的
固定步骤:
需要引入:var http=require("http");
var app=http.createServer();
app.listen(80);
app.on("request",(req,res)=>{
//req->request,保存请求对象:保存着前端传来的请求相关的数据:req.url->路由&查询字符串部分
//res->response,响应对象:后端也可以响应一些东西给前端看:res.end();、
})
详见:node.js教学资料中12.js
感悟:一切的src和href都是一个请求/路由,这个请求就需要后端来解析,根据不同的请求会跟我们不同的响应
【2】、第三方模块 -
多到数不清,提供了很多官方模块没有的东西,有一个网址npm可以去下载:mysql、express框架
如何去使用第三方模块:npm:node package manager:node的包/模块管理器:专门管理第三方模块的:作用:下载、更新、删除、维护包的依赖关系
打开网站:npm官网
搜索你需要用到的模块:尽量用带有完全符合版标签的那个包
1、打开cmd:检查npm是否安装成功:npm -v
2、下载:npm i 包名 //i:install:安装
3、更新:npm up 包名
第三方模块包:mysql如何使用
1、需要引入:var mysql=require('mysql');
2、后端<=>数据库:
1、创建数据库的连接对象
var conn = mysql.createConnection({
host : '127.0.0.1',
user : 'root',
password : '',
database : 'h52107'
});
2、创建SQL语句
var sql="INSERT/DELETE/UPDATE/SELECT";
3、执行SQL语句
conn.query(sql, (err,result)=>{
console.log(result);
//增删改:成功OK对象,失败undefined
//查:成功获得的是一个JSON对象:[{},{},{},{},....]
});
4、断开和数据库的连接
conn.end();
3、前端<=>后端
1、前端发起请求:2种:
1、表单:发起同步请求
2、ajax:发起异步请求,获取后端响应的数据
2、后端怎么接住前端的东西,并且发送响应给前端
1、搭建服务器
2、判断好路由
3、objUrl.query - 保存住前端传来的查询字符串部分
4、响应数据:res.end(JSON.stringify(json));//响应
【3】、自定义模块
自己书写的js:require("./模块名")
为什么有的模块引入要./有的不用./
自定义模块:分为2大种操作方式:
1、文件模块:创建xx.js去公开需要公开的内容,主模块想要引入必须写为require("./模块名")
2、目录模块:3种
1、比如创建m1的文件夹,在其中创建index.js的文件,去公开需要公开的内容主模块想要引入必须写为require("./m1")
2、比如创建m2的文件夹,在其中创建xx.js的文件,去公开需要公开的内容主模块想要引入必须写为require("./m2")
必须在创建一个package.json的配置文件,写入:{"main":"xx.js"}
3、创建一个文件夹必须名为:node_modules,再在其中创建一个名为m3的文件夹,再在其中创建index.js
去公开需要公开的内容,主模块想要引入必须写为require("m3")
其实真实开发中,我们程序员用的最多的就是文件模块,目录模块的第三种方式其实根本就不是人用的(第三方模块下载后自动创建此文件夹)