什么是nodejs?

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。
Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。
Node对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。Node是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。

nodejs核心模块 — url

控制台输入node指令
-url.parse(str[,bool])可以将地址解析成对象

如果只有第一个参数:

url.parse('http://localhost:3000/api?course=node&class=1902#url')

控制台输出为:

Url {
protocol: 'http:', // 协议
slashes: true,
auth: null,
host: 'localhost:3000', // 域名 + 端口
port: '3000', // 端口号
hostname: 'localhost', // 域名
hash: '#url', // 哈希值
search: '?course=node&class=1902', // ? + 参数
query: 'course=node&class=1902', // 字符串形式的参数
pathname: '/api', // 路由 --- 标识的是哪一个页面或者哪一个接口
path: '/api?course=node&class=1902', // 路由 + search
href: 'http://localhost:3000/api?course=node&class=1902#url' }

如果有第二个参数,并且值为true时:

url.parse('http://localhost:3000/api?course=node&class=1902#url', true)

控制台输出为:

Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'localhost:3000',
port: '3000',
hostname: 'localhost',
hash: '#url',
search: '?course=node&class=1902',
query: { course: 'node', class: '1902' }, // *****************
pathname: '/api',
path: '/api?course=node&class=1902',
href: 'http://localhost:3000/api?course=node&class=1902#url' }

还学习了URL模块结和nodejs服务器的使用:

  • url.parse(req.url, true).query获取到参数信息

  • url.parse(req.url, true).pathname获取到路由信息

  • url.parse(req.url, true).port获取到端口号

  • url.parse(req.url, true).protocol获取到协议信息

  • url.parse(req.url, true).hostname获取到域名信息

nodejs核心模块querystring

querystring.parse(str)可以将字符串形式的参数解析成对象

以及querystring模块结合nodejs服务器的使用

前后端分离与耦合构架的概念

前后端分离

前端HTML页面通过Ajax调用后端的RestFul API并使用Json数据进行交互


前后端耦合

前端写完的HTML页面交给后端,后端负责渲染数据,前后端相互调整的方式

nodejs学习过程

1.如何使用express来创建服务器:
利用终端安装express模块,再利用相应的命令来实现服务器的创建
安装express生成器,通过应用生成器工具 express-generator 可以快速创建一个应用的骨架
利用命令生成项目

2.静态文件资源托管(static)
为了提供诸如图像、CSS 文件和 JavaScript 文件之类的静态文件,请使用 Express 中的 express.static 内置中间件函数。

3.路由
路由是指确定应用程序如何响应对特定端点的客户端请求,该请求是URI(或路径)和特定HTTP请求方法(GET,POST等)。每个路由都可以有一个或多个处理函数,这些函数在路由匹配时执行。

4.中间件
中间件函数是可以访问请求对象 (req),响应对象(res)以及next应用程序请求 - 响应周期中的函数的函数。该next功能是Express路由器中的一个功能,当被调用时,它将执行当前中间件之后的中间件。
可以使用 app.use() 调用中间件

5.ejs模板的使用
EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。

  • 前端ejs模板中使用变量
<%- title %> // 解析
<%= title %> // 转义 --- 原样输出
  • 导入代码片段
<%- include('./header.ejs') %>
  • 条件判断
<% if (!flag) { %> <ul> <li>week1</li></ul>
<% } %>
  • 循环语句
<% for (var i = 0; i < list.length; i++) { %><p><%- list[i] %></p>
<% } %>

6.mongodb的使用:
mongodb是一个基于分布式文件存储的数据库
命令行操作MongoDB
D盘mongodb文件夹内解压下载好的mongodb文件

D盘根目录下创建一个文件夹data,在data内部再创建一个文件夹db

进入到mongodb的bin目录

按住shift,点击鼠标的右键,打开命令行窗口,输入如下指令打开数据库连接池

mongod --dbpath d:\data\db

再在此目录中,按住shift,点击鼠标的右键,打开命令行窗口,输入如下指令打开一个连接数据库的客户端,不要关闭上一个窗口

mongo

数据库常用命令

查询数据库

show dbs

删除数据库

db.dropDatabase()

collection 聚集集合操作

创建集合

db.createCollection(name, options)
db.createCollection("collName", {size: 20, capped: true, max: 100});

document文档操作
插入文档

db.collection.insertOne(document) // 向指定集合中插入一条文档数据
db.collection.insertMany(document) // 向指定集合中插入多条文档数据

查询数据

db.find()
db.find().pretty()  // 使用 pretty() 方法以格式化的方式来显示所有文档

删除数据

db.users.deleteOne() // 删除一条数据
db.users.deleteMany()   // 删除多条数据

修改数据

db.users.updateOne() // 修改一条数据
db.users.updateMany()   // 修改多条数据

查询数据显示字段

db.users.find({条件},{字段名})
nodejs结合mongodb

首先需要安装mongoose
然后再连接数据库
再设计用户数据表,暴露数据模型,并且在数据库中创建了集合

1.封装数据库模块
module.exports = {// 增insert (insertData) {  insertData.save(err => {if (err) throw err;console.log('insert success');})},// 删delete: (col, type, deleteData) => {col[type](deleteData, err => {if (err) throw err;console.log('delete success');})},// 改update: function (col, type, whereObj, updateObj) {col[type](whereObj, updateObj, err => {if (err) throw err;console.log('update success');})},// 查find (col, whereObj, showObj) {col.find(whereObj, showObj).exec((err, data) => {if (err) throw err;console.log(data);})},// 排序sort (col, whereObj, showObj, sortObj) {col.find(whereObj, showObj).sort(sortObj).exec((err, data) => {if (err) throw err;console.log(data);})}
}

回调函数解决异步数据问题
在每一个函数后边再新添加一个参数callback

insert (inserData, callback) {insertData.save(err => {if (err) throw err;callback();})
}sql.insert(user, () => {console.log(''insert success)})

promise解决异步数据问题

insert (inserData) {return new Promise((resolve, reject) => {insertData.save(err => {if (err) throw err;resolve();})})
}sql.insert(user).then(() => {console.log(''insert success)})

后台管理系统

下载admin-lte模板
安装第三方模块

cnpm i supervisor -g (只需要装一次)

安装成功之后就不需要每次修改nodejs代码都重新启动服务器了,更加便捷我们的使用

admin-lte的模板结合express
1.复制结构
2.添加样式
3.处理js
4.分割页面取出共同的部分
5.页面通过路由使用

var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {res.render('user'); // 此处user为关键词
});
module.exports = router;

6.让路由生效
7.添加数据表格

学习后台管理系统就是为了让我们更方便的去使用它
当然还有后台管理系统的增删改查操作,如何添加数据,删除数据,修改数据,查询数据

导入数据
安装node-xlsx模块
导入数据并且插入数据库

**后台管理系统的登录功能
创建一个新的ejs文件,然后实现一个跳转到登录的路由,
再利用bcrypt实现数据的实时加密,最后还需要验证是不是登录状态,用cookie和session分别存储状态,也大致了解了一下token

接口

接口规范

  • 接口名称
  • 场景说明
  • 接口说明
  • 请求参数
  • 响应参数
  • 错误码

参数内容

  • 字段名
  • 变量名
  • 是否必填
  • 类型
  • 示例值
  • 描述

错误码内容

  • 名称
  • 描述
  • 原因
  • 解决方案

postman接口调试工具的使用
用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。

接口的编写
前后端分离:res.send()
前后端不分离:res.render()
前端利用ajax调用接口,遇到跨域问题,可以使用jsonp和cors来解决,还可以使用服务器代理,但一般推荐使用cors来解决,代码量比较少

文件上传
初始上传发现没有后缀名,需后面把 mimetype 字段的 png 提取出来,然后与文件名组合,就可以显示这张图片
其实就是更改文件名称的功能

SSR
SSR是 Server-Side Rendering(服务器端渲染)的缩写,在普通的SPA中,一般是将框架及网站页面代码发送到浏览器,然后在浏览器中生成和操作DOM(这里也是第一次访问SPA网站在同等带宽及网络延迟下比传统的在后端生成HTML发送到浏览器要更慢的主要原因),但其实也可以将SPA应用打包到服务器上,在服务器上渲染出HTML,发送到浏览器,这样的HTML页面还不具备交互能力,所以还需要与SPA框架配合,在浏览器上“混合”成可交互的应用程序。所以,只要能合理地运用SSR技术,不仅能一定程度上解决首屏慢的问题,还能获得更好的SEO。

SSR的优点:

  • 更快的响应时间,不用等待所有的JS都下载完成,浏览器便能显示比较完整的页面了。
  • 更好的SSR,我们可以将SEO的关键信息直接在后台就渲染成HTML,而保证搜索引擎的爬虫都能爬取到关键数据。

SSR的缺点

  • 相对于仅仅需要提供静态文件的服务器,SSR中使用的渲染程序自然会占用更多的CPU和内存资源
  • 一些常用的浏览器API可能无法正常使用,比如windowdocmentalert等,如果使用的话需要对运行的环境加以判断
  • 开发调试会有一些麻烦,因为涉及了浏览器及服务器,对于SPA的一些组件的生命周期的管理会变得复杂
  • 可能会由于某些因素导致服务器端渲染的结果与浏览器端的结果不一致。

SSR常用框架

  • React的Next
  • Vue.js的Nuxt

SEO的优化

通过网站的结构布局设计和网页代码优化,使前端页面既能让浏览器用户能够看懂,也能让“蜘蛛”看懂。

Socket通讯

socket 网络传输 — 双向数据传输

Socket简介和通讯流程
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

接触NodeJs的一周相关推荐

  1. java中对于框架的理解_接触Java项目一周后对一些基本框架的理解 | 学步园

    最近一周接触了一个Java EE的B/S项目,里面用到了SSH,部分持久层用的是ibatis,接触完后觉得有收获,于是把认识到的记录下来.同时欢迎高手拍砖. 现在终于知道所谓的三层框架(视图层,业务逻 ...

  2. 很久没来,丢一份前阵子做的 10 万连接性能测试 (fibjs, golang, nginx, nodejs)

    测试内容 动态HTTP服务器极限性能,分为两项: 优化前后的各版本fibjs 优化后的fibjs.使用cluster的nodejs.基于模块的nginx.使用多核的go 测试环境及方法 服务器 CPU ...

  3. 一个简单express+jade+mysql+bootstrap+nodejs的demo

    Nodejs迅速发展,目前最热的Nodejs构建框架非express莫属,在Github上有32k的star就可以证明.下面就以Nodejs为中心构建一个前后端都包含在内的简单demo吧. 不管开发什 ...

  4. NodeJS起步两三事

    主要是为了备忘,开始接触NodeJS有一段时间,断断续续,年纪也大了时间一长容易忘事情,汗. 安装Node 直接到官网下载LTS版本安装即可,没必要追新功能用最新版.安装Node基本没什么坑,记得加到 ...

  5. NodeJS、NPM安装配置步骤(windows版本)

    2013-06-15 13:52:18|  分类: JavaScript |  标签:nodejs  npm  |举报|字号 订阅 下载LOFTER我的照片书  | 1.windows下的NodeJS ...

  6. 过年7天乐,学nodejs 也快乐

    自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看, 上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqlovin ...

  7. NodeJS、NPM安装配置与测试步骤(windows版本)

    1.windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的"INS ...

  8. nodejs全局变量第一次没赋值要第二次才有是为什么_【NodeJS】async 和 await 的本质...

    对于许多新接触 NodeJS 的人而言,async 和 await 的原理是比较难理解的.本文将从零"构建"出 async 和 await 关键字,从而帮助理清 async 和 a ...

  9. Windows环境下的NodeJS+NPM+Bower安装配置步骤

    Windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的"INSTA ...

最新文章

  1. 【直播】闫强:文本分类上分利器 -- Bert微调技巧大全
  2. 企业级监控软件Zabbix搭建部署之使用mutt+msmtp配置Zabbix邮件报警
  3. python 拓扑排序_拓扑排序(topsort)算法详解
  4. tcp ip协议_网络通信-TCP/IP协议族简述
  5. 第一个Scala程序——Hello World!
  6. 《设计模式其实很简单》
  7. [POJ 1273]Drainage Ditches
  8. Fun with Opterons, SATA, and INNODB
  9. bulk interface驱动_USB驱动程序(较详细)三
  10. 使用Vue解决跨域问题
  11. 没想到,买了这款不靠谱的达尔文重疾险易核版,成了他一生的噩梦
  12. 叠片过滤器安装维护注意事项
  13. 如何定位在测试中遇到的Bug?
  14. win7计算机网络机组用户名,win7连接局域网时的用户名及网络密码是什么?
  15. mysql查询日期_mysql 查询当前日期
  16. 西电计算机组织与体系结构实验,《计算机组织与体系结构》实验.doc
  17. 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之9---移动增值业务产业链
  18. 记一次微信小程序申请定位权限的开发
  19. Box2D v2.1.0用户手册翻译 - 第12, 13, 14章
  20. Emeditor删除整行

热门文章

  1. 如何用命令ping计算机型号,怎么修改cmd中ping命令的数据包大小?
  2. mini6410 用fb显示bitmap
  3. html文档 手机分页阅读,HTML书本分页(HTML book-like pagination)
  4. C语言经典100例(6)——用*号输出字母C的图案。
  5. “封神台”靶场跑不了爆破,临时解决办法(亲测有效)
  6. JavaScript常见的请求头和响应头
  7. 强大的选择器 虐我千百遍
  8. ORB-SLAM2 ORBmatcher.cc读代码一
  9. 接口分析--腾讯软件中心应用信息接口
  10. Linux之学习目标,初识linux操作系统。(其开发者们之无私奉献与分享合作精神,使我辈敬佩之至,在此由衷地向前辈们表达敬意与感谢。)