看过很多朋友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请求过来的数据,来实现图片上传

node.js浅见的更多相关文章

  1. 【转】node.js框架比较

    我偶然间看到这篇文章,转这个文章并没有什么含义,仅仅是感觉总结的不错,对于新学node的友友们来说希望这篇文章为大家对 Node.js 后端框架选型带来一些帮助,学习不再迷茫,也是让我有个保存,以后参 ...

  2. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  3. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  4. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  5. Node.js:理解stream

    Stream在node.js中是一个抽象的接口,基于EventEmitter,也是一种Buffer的高级封装,用来处理流数据.流模块便是提供各种API让我们可以很简单的使用Stream. 流分为四种类 ...

  6. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  7. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  8. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  9. Node.js入门(一)

    一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...

随机推荐

  1. HTML列表与表格

    border:控制边框 width:宽度 height:高度 table是表格 tr:行 td:列★ colspan:合并列★rowspan:合并行★ <!doctype html> &l ...

  2. 最近发现一个php trim的bug

    用trim 排除字符串两边的 “.”:你会发现“耀.”会出现编码错误问题,导致程序出现错误!代码如下: $a = "王者荣耀."; echo trim($a,".&quo ...

  3. Linux系统安装tomcat

    1.首先下载tomcat:http://tomcat.apache.org/download-60.cgi 2.解压缩tar.gz文件: tar -xzvf xxxxxxx/apache-tomcat ...

  4. cve-2018-4878漏洞复现

    CVE-2018-4878Flash 0day漏洞1.漏洞概述2018年2月1号,Adobe官方发布安全通报(APSA18-01),声明Adobe Flash 28.0.0.137及其之前的版本,存在 ...

  5. flask基础三

    一.路由和视图(基础二上补充) (1)有参装饰器 路由采用的是有参装饰器实现的 @app.route("/index",methods=["GET"," ...

  6. Logstash - Working with plugins(使用插件)

    本章节开始介绍logstash的插件及功能,插件对于logstash来说非常重要,按类别分为:input.filter.codec.output四种类型. logstash有非常丰富的插件,通过安装目 ...

  7. 常用数据类型的方法--str、int、list、dict

    一.字符串类型(str) class str(basestring): """ str(object='') -> string Return a nice str ...

  8. 某平台实时数据录入js代码的修改坑点

    在隐形内嵌函数使用的时候,很容易把这一点忘记了:内嵌函数不能修改外部函数的变量和参数 使用了mysql存储过程实现数据计算,导致高并发的时候数据库挂掉 mysql最大连接数调整到16384 之前为10 ...

  9. 优秀的云计算工程师需要学什么?云计算Docker学习路线

    云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...

  10. 客户端不能连接MySQL - 2003-Can't connect to MySQL server on '192.168.43.180'(10060 "Unknown error")

    客户端不能连接MySQL 场景: 数据库(此处以MySQL为例)安装在虚拟机里面,在宿主机上进行连接数据库的时候始终不能连接,但在虚拟机中使用正常. 针对上面的场景: 1. 在虚拟机里面可以正常使用M ...