node.js浅见
看过很多朋友node.js代码敲得很好,但是对于概念还是很生疏。个人认为,代码是树叶,树干搭起来才是王道。
1.简述node.js的适用场景:
IIO密集而非计算密集的情景:高并发微数据(比如账号系统)的情景。
特别是高并发,Node.js的性能随并发的数量的提高而衰减的现象相比其他server都有很明显的优势。
2.node.js的定义:
是一个基于Chrome V8引擎的javaScript运行环境。node.使用了一个事件驱动,非阻塞式I/O的模型(动态分配),使其轻量又高效。
Node.js的使用: 中间层(node.js)
用户浏览器=>node.js=>java服务器
搭建node.js的目的解决高并发问题,同时也解决了性能问题。
3.node.js和浏览器的区别:
在浏览器中有DOM和BOM 的概念,在node.js中没有这两个概念,在node.js有process变量(global对象的属性,用来描述node.js的进程)的概念,浏览器没有这个概念。
浏览器由于安全性的限制不允许调用一些底层的方法。但node.js允许使用各种各样的底层的api
4.node.js的缺点:
处理大量数据的时候速度会很慢。
5. node.js的规范:
Amd: 推崇依赖前置,提前执行,API 默认是一个当多个用
Cmd: 推崇依赖就近,是延迟执行,API 严格区分,推崇职责单一
6.socket,websocket,socketio的实现原理和机制
socket:socket的通信机制是两个程序进行双向数据传输的网络通信端点,由一个地址和端口号来表示(全双工机制)。
websocket:用于web浏览器和服务器之间进行任意的双向数据的传输的一种技术。
机制:浏览器通过Javascript向服务器发出建立websocket链接的请求,链接建立以后,客户端和服务器端就可以通过Tcp链接直接交换数据。
socketio: Socket.IO实现了实时、双向、基于事件的通讯机制,它解决了实时的通信问题,并统一了服务端与客户端的编程方式。启动了Socket以后,就像建立了一条客户端与服务端的管道,两边可以互通有无。
Socket.IO能够根据浏览器对通讯机制的支持情况自动地选择最佳的方式来实现网络实时应用。
7.mocha 自动化测试
chai:(第三方模块)它的三个方法:
Should
chai.should(); foo.should.be.a('string');
Expect
var expect = chai.expect; expect(foo).to.be.a('string');
Assert
var assert = chai.assert; assert.typeOf(foo, 'string')
8.中间件的概念:
中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)), 响应对象(response object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。
中间件的功能包括:
执行任何代码。
修改请求和响应对象。
终结请求-响应循环。
调用堆栈中的下一个中间件。
如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。
9. 模板引擎的原理:
模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
10.事件代理
利用冒泡的原理,把事件加到父级上,触发执行效果。
e.target: 冒泡的起始的元素
e.currentTarget :给谁委托的事件指向谁
11.cookie-session的安全性
登录的用户信息和用户权限都不放在cookie里,这样非常不安全,前端随时可以修改,但是做持久登录又要用到cookie,假设用户登录成功,后端会在session里面存储用户的信息, 后端把session里的key值传给前端,前端把id值写(种)到cookie里面,前端再向后端发请求的时候,后端能拿到cookie里的字符串,后端会用这个字符串到session里面找数据,这样就保证了安全性
12.前端代码优化
前端优化的目的是什么 ?
从用户角度而言,优化能够让页面加载得更快、对用户的操作响应得更及时,能够给用户提供更为友好的体验。
从服务商角度而言,优化能够减少页面请求数、或者减小请求所占带宽,能够节省可观的资源。
前端优化方式
减少 HTTP请求数
将外部脚本置底(将脚本内容在页面信息内容加载后再加载)
异步执行 inline脚本(其实原理和上面是一样,保证脚本在页面内容后面加载。)
Lazy Load Javascript(只有在需要加载的时候加载,在一般情况下并不加载信息内
将 CSS放在 HEAD中
异步请求 Callback(就是将一些行为样式提取出来,慢慢的加载信息的内容)
减少不必要的 HTTP跳转
避免重复的资源请求
13.node.js的版本号:
三个数字分别代表大版本号,小版本号,补丁版本号
v6.10.3 LTS v7.10.0 Current
偶数位为稳定版本:v6.8.x v6.6.x v6.4.x
基数位为非稳定版本:v6.9.x v6.7.x v6.5.x
14.MVC框架
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
Model(模型)表示应用程序核心(比如数据库记录列表)。
View(视图)显示数据(数据库记录)。
Controller(控制器)处理输入(写入数据库记录)。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图)是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器)是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC的作用:MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
15 express的特点:
express是基于回调函数的框架,简化了node代码的编写。
express是用node语法写的(node的代码很零散,使用express框架,简化了代码量,更加规范。)
koa的特点:
不依赖于回调函数,比express的参数多了一个next参数,也就是中间件。使用express use使用中间件
它依赖于Es7的async
16.ejs模板的引擎的基本语法:
<% %>流程控制标签
<%= %>输出标签(原文输出HTML标签1)
<%- %>输出标签(HTML会被浏览器解析 加粗的1)
<%# %>注释标签
% 对标记进行转义 <%%= name %%>
17.npm和yarn的使用:
npm(node package manager)
Node.js的包管理器,全球最大的开放源代码的生态系统。
公司级别的npm(一般会有一个私有的仓库,而不会是用官方网站上的仓库)。
在npm中上传包的步骤:
(npm是一个node的包管理库,也是一个网站,还是一条命令。)
首先要到npm的官网注册一个npm的账号。(要进行邮箱的验证,存好自己的账号和密码)
在工程目录中使用npm init命令(name的值一定要全网唯一),=>生成package.json文件,当这个文件生成的时候,你的目录就是一个node包。
执行npm adduser
执行npm publish
如果别人要想下载你上传的包,执行这个命令npm install +上传的包名。
npm的缺点:
a.包是同步加载的很慢。
b.下载过一次的在另外一个项目还要重新下载。
Yarn:.yarn
a.Yarn是一个命令,是命令npm的包装。
b.Yarn的优点:
Yarn是异步的比npm快;
团队编程中使用yarn可以有效地保证版本号一致开发时不易出错。
Yarn已经安装的包会有缓存,安装本地的包,直接调用缓存里面的包,速度很快。
npm和yarn的一些命令的区别:
npm install cherrio=yarn add cheerio (下载和安装第三方模块)
npm install cheerio –save=yarn add cheerio –dev(下载和安装第三方模块)
npm update cheerio –dev-save=yarn add cheerio –dev (更新第三方模块)
npm unintall cheerio=yarn remove cheerio(删除第三方模块)
18.核心模块和对应的方法:
1.http //连接服务器与客户端 const http = require("http"); 2.fs //文件系统 const fs = require("fs"); 3.zlib //压缩 const zlib =require("zlib"); 4.querystring //查询字符串 const querystring = require("querystring"); 5.url //网址 const url = require("url"); 6.net //模块提供了创建基于流的 TCP 或 IPC 服务器 (net.createServer())和客户端(net.createConnection()) 的异步网络 API。 const net = require("net"); 7.readline //逐行读取 const readline = require("readline"); 8.path //用于处理文件与目录的路径 var path = require('path'); 9.assert //断言,测试用 10.evens //事件 const EventEmitter = require('events'); 11.util //模块主要用于支持 Node.js 内部 API 的需求 const util = require('util');
19.mongo数据库的基本指令:
数据库常用命令:
1.Help查看命令提示
Help //数据库服务器级别 db.help() //数据库级别 db.test.help() test是具体集合名 //数据库中表的级别 db.test.find().help() //表中数据的级别
2.创建/切换数据库
use music
3.查询数据库
show dbs
4.查看当前使用的数据库
db/db.getName()
5.显示当前DB状态
db.stats()
6.查看当前DB版本
db.version()
7.查看当前DB的链接机器地址
db.getMongo() 常用
8.删除数据库
db.dropDatabase()
Collection聚集集合操作:
1.创建一个聚集集合
db.createCollection("collName", {size: 20, capped: true, max: 100}); db.collName[集合名].isCapped(); //判断集合是否为定容量
2.得到指定名称的聚集集合
db.getCollection("account");
3.得到当前db的所有聚集集合
db.getCollectionNames();
4.显示当前db所有聚集的状态
db.printCollectionStats();
添加、修改与删除集合数据;
1.添加
db.users.save({name: ‘zhangsan', age: 25, sex: true});
2.修改 (如果不存在是否新增,是否修改多条)
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true); 相当于:update users set name = ‘changeName' where age = 25; db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true); 相当于:update users set age = age + 50 where name = ‘Lisi'; db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true); 相当于:update users set age = age + 50, name = ‘hoho' where name = ‘Lisi';
3.删除
db.users.remove({age: 132});
聚集集合查询:
查询所有记录
db.userInfo.find(); 相当于:select* from userInfo;
查询去重后数据
db.userInfo.distinct("name"); 相当于:select distict name from userInfo;
查询age = 22的记录
db.userInfo.find({"age": 22}); 相当于: select * from userInfo where age = 22;
查询age > 22的记录
db.userInfo.find({age: {$gt: 22}}); 相当于:select * from userInfo where age >22;
查询age < 22的记录
db.userInfo.find({age: {$lt: 22}}); 相当于:select * from userInfo where age <22;
查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}}); 相当于:select * from userInfo where age >= 25;
查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
查询age >= 23 并且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
查询name中包含 mongo的数据
db.userInfo.find({name: /mongo/}); //相当于%% select * from userInfo where name like ‘%mongo%’;
查询name中以mongo开头的
db.userInfo.find({name: /^mongo/}); select * from userInfo where name like ‘mongo%’;
查询指定列name、age数据
db.userInfo.find({}, {name: 1, age: 1});
相当于:select name, age from userInfo;
查询指定列name、age数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相当于:select name, age from userInfo where age >25;
按照年龄排序
升序:db.userInfo.find().sort({age: 1}); 降序:db.userInfo.find().sort({age: -1});
查询name = zhangsan, age = 22的数据
db.userInfo.find({name: 'zhangsan', age: 22}); 相当于:select * from userInfo where name = ‘zhangsan' and age = ’22';
查询前5条数据
db.userInfo.find().limit(5); 相当于:select top 5 * from userInfo;
查询10条以后的数据
db.userInfo.find().skip(10); 相当于:select * from userInfo where id not in ( select top 10 * from userInfo);
查询在5-15之间的数据
db.userInfo.find().limit(10).skip(5);
or与 查询
db.userInfo.find({$or: [{age: 22}, {age: 25}]}); 相当于:select * from userInfo where age = 22 or age = 25;
查询第一条数据
db.userInfo.findOne(); 相当于:selecttop 1 * from userInfo; db.userInfo.find().limit(1);
查询某个结果集的记录条数
db.userInfo.find({age: {$gte: 25}}).count(); 相当于:select count(*) from userInfo where age >= 20;
按照某列是否存在某个数据
db.userInfo.find({sex: {$exists: true}}).count(); 相当于:select count(sex) from userInfo;
20.数据存储的方式
Cookie:本地,可以设置时长,大小为4kb,cookie在域名级别是有隔离的,全兼容,使用起来很麻烦
LocalStorage:本地,移动端,大小5mb,域名级别是有隔离的,使用起来很简单,生命周期是永恒的。只能存字符串,不能存对象。实例:表单回填
Try{ LocalStorage.name=”cindy” //这里面出错,不会影响程序的执行。 }catch(e){}
Session:服务器
sessionStorage:本地,移动端,大小5mb,域名级别是有隔离的,使用起来很简单,生命周期是一个会话级别,浏览器关闭就消亡。
Ajax做文件上传就会有兼容性的问题,只有高版本浏览器才能实现图片上传,ie6,ie7,这些低版本浏览器无法实现ajax图片上传,在公司级别的上传图片是不会使用ajax上传图片,一般使用form表单来进行图片的上传(实现全兼容)。
图片上传用post方法上传。
用ajax模拟form表单实现图片上传
Multer是一个express的中间件可以帮助我们,接收formdata请求过来的数据,来实现图片上传