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

时间: 2024-10-16 12:47:22

node.js浅见的相关文章

node.js的安装及配置

一.安装 直接在浏览器搜索node.js,在官网上下载(一般旧版的更加稳定,比如下载4.4.7版本) 点击DOWNLOADS 往下翻,点击Previous Release Windows下载msi(64位/32位) 根据提示一步步安装,安装之后的文件夹如下: 在cmd命令行下输入node -v,如果出现如下,说明安装成功: 二.关于配置 在安装路径下新建两个文件夹: 创建完两个空文件夹之后,打开cmd命令窗口,输入 npm config set prefix "D:\Program Files

Node.js: Extend and Maintain Applications + large scale

https://blog.risingstack.com/node-js-mysql-example-handling-hundred-gigabytes-of-data/ My secondary goal with this article is to help you decide if Node.js + MySQL is a good fit for your needs, and to provide help with implementing such a solution. h

1.node.js windows环境搭建

作为服务端运行javascript的平台的NodeJs,把前台javascript移到了服务器端,Google V8引擎使其运行效率非常高,它可以异步,无任何阻塞运行程序.nodejs包含http服务器,可以为我们实现 web系统设计,客户端javascript编译器,等一系列的功能. 工具/原料 windows系统电脑 ,电脑可以上网 方法/步骤 下载windows平台nodejs环境安装包,百度一下nodejs官网,找到DOWNLOADS点击,找到Windows Installer 如果为6

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任

node.js搭建代理服务器请求数据

1.引入node.js中的模块 1 var http = require("http"); 2 var url = require("url"); 3 var qs = require("querystring"); 2.创建服务器 //用node中的http创建服务器 并传入两个形参 http.createServer(function(req , res) { //设置请求头 允许所有域名访问 解决跨域 res.setHeader("

Node.JS 文件读写,把Sheet图集转换为龙骨动画图集

Node.JS 文件读写,把Sheet图集数据转换为龙骨动画图集数据 var fs = require("fs") var readline = require("readline"); var rl = readline.createInterface({ input:process.stdin, output:process.stdout }); var path = undefined; var dbName = undefined; rl.question(

10个常见的Node.js面试题

如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对Node.js的掌握程度. 本文就为你罗列了10个常见的Node.js面试题,分别考察了Node.js编程相关的几个主要方面. 在进入正文之前,需要提前声明两点: 这些问题只是Node.js知识体系的一个局部,并不能完全考察被面试者的实际开发能力. 对现实世界开发中遇到的问题,需要的是随机应变与团队合作,所以你可以尝试结对编程. Node.js面试题列表 什么是错误优先的回调函数? 如何避免回调地狱? 如何用Node来监听8

CentOS6.5 安装Node.js

Node.js的安装通常有两种方式:自己编译源代码和使用编译好的文件,我这里使用编译好的文件目前我的home目录下有刚下载来的node-v4.2.3-linux-x641.首先解压缩 tar xvf node-v4.2.3-linux-x64 2.设置链接 ln -s /home/node-v4.2.3-linux-x64/bin/node /usr/local/bin/node ln -s /home/node-v4.2.3-linux-x64/bin/npm /usr/local/bin/n

使用NPM安装Node.js模块以及调试

npm npm 作为Node.js的包管理器,是经常用到的工具. 注意:全局安装一个框架,需要加参数-g npm install -g express 安装后 在项目中只需要导入包即可 var http = require('http'); 调试 调试Node的最简单的方式就是console.log(),但是有时候也需要单步调试 在需要调试的地方写入debugger node debug *.js node中的测试命令: next,n:单步执行 cont,c:继续执行,直到遇到下一个断点 ste