NodeJS学习笔记--NodeJS+Express基础概念梳理记录

图文无关

写在前面

本文章来源于一次分享中的笔记记录。用于梳理基础概念。

名词解释

Node.js

是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用,Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时应用。

NPM

一个NodeJS包管理和分发工具,它可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包

Express

Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架


创建服务实例

var http = require('http');
var port = 3000;
var server = http.createServer(function(req,res) {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
})
server.listen(port,function() {
  console.log('Server running');
});

NodeJS特点

  • 事件驱动

事件驱动模型三大要素:
事件源:能够接收外部事件的源体。
侦听器:能够接收事件源通知的对象。
事件处理程序:用于处理事件的对象。

  • 非阻塞I/O

阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  • 事件轮询机制

一个事件轮询拥有下面三个组件
事件队列:这是一个FIFO模型的队列,一方推入事件,另一方推出事件
队列的读取轮询线程组件,也就是主角Event Loop,
单独的线程池: 用来执行长任务(也就是threadpool,node底层,用C++写的,不会阻塞)
[图片上传失败...(image-3715ac-1657726849656)]
在NodeJS中,只有一个主线程(也就是前面说的单线程)来不断读取轮询(书中称为调用I/O观察者)队列中是否有事件。而对于读取文件,HTTP请求等比较容易堵塞的事件,就在这个单线程中执行肯定会造成堵塞,所以Event Loop会把这类型的事件交给底层的线程池执行,并给予线程池一个回调函数,当线程池操作完成这堵塞任务后,便把结果和回调函数一起再放入轮询队列中。当单线程从队列中不断读取事件,读取到这些堵塞的操作结果后,会将这些操作结果作为回调函数的输入参数,然后激活运行回调函数。
Node.js的这个单线程不只是负责读取队列事件,还会执行运行回调函数
优点:适合大量I/O计算
缺点:不适合密集的cpu计算


NodeJS部分模块介绍

  • http http是Node.JS从HTTP服务器获取相应内容的主要模块
http.createServer()//返回一个新的Web服务器对象
http.listen()//在指定的主机名和端口上建立连接
  • fs 处理文件系统的相关操作,例如读写文件,设置文件权限
  • path
path.extname('index.html')
// Returns: '.html'
path.dirname('/foo/bar/baz/asdf/quux')
// Returns: '/foo/bar/baz/asdf'
  • cluster模块
    产生更多的NodeJS进程来处理系统的加载,使用相同的源代码,监听相同的端口
var cluster = require('cluster');
var numCpus = require('os').cpus().length;
cluster.isMaster//判断是否为主进程
cluster.isWorker//判断是否为子进程
cluster.worker.process.pid//获取进程pid

NodeJS代理本地文件实例

var url  = require("url"),
     fs=require("fs"),
     http=require("http"),
     path = require("path");
http.createServer(function (req, res) {
    var pathname=__dirname+url.parse(req.url).pathname;//__dirname使用该全局变量的绝对路径
    fs.exists(pathname,function(exists){
        if(exists){
            switch(path.extname(pathname)){
                case ".html":
                    res.writeHead(200, {"Content-Type": "text/html"});
                    break;
                case ".js":
                    res.writeHead(200, {"Content-Type": "text/javascript"});
                    break;
                default:
                    res.writeHead(200, {"Content-Type": "application/octet-stream"});
            }

            fs.readFile(pathname,function (err,data){
                res.end(data);
            });
        } else {
            res.writeHead(404, {"Content-Type": "text/html"});
            res.end("<h1>404 Not Found</h1>");
        }
    });
}).listen(8080, "127.0.0.1");

创建Web服务

安装Express npm install express -g

  • 执行Express
  • 目录结构
├─bin
├─public
│  ├─images
│  ├─javascripts
│  └─stylesheets
├─routes
├─views
├─app.js
└─package.json


Express API

Express 是一个自身功能极简,完全是由路由和中间件构成一个的 web 开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。

中间件

中间件是一个函数,它可以访问请求对象, 响应对象, 和 web 应用中处于请求-响应循环流程中的中间件

  • 执行任何代码。
  • 修改请求和响应对象。
  • 终结请求-响应循环。
  • 调用堆栈中的下一个中间件。
路由

路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。

  • HTTP请求方法
  • 请求路径
  • 回调函数
  • 相应函数
var express = require('express');
var app = express();
app.get('/', function(req, res) {
  res.send('hello world');
});
  • Router()创建路由模块化

引用文件

NodeJS官方文档
Express4.x中文文档
Node.JS项目实践构建可扩展的Web应用书籍
了不起的NodeJS书籍
对NodeJS事件轮询的理解
事件驱动

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • Node基本 node的最大特性莫过于基于事件驱动的非阻塞I/O模型。 node通过事件驱动的方式处理请求,无须为...
    AkaTBS阅读 2,170评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,116评论 25 707
  • 总结一: [node.js总结](http://www.cnblogs.com/Darren_code/archi...
    xiumeiii阅读 1,890评论 0 14
  • 上周,听一位研究传统文化的学者讲座。这位学者说,现在的家庭教育有些地方不到位,关键在于家长的角色没有摆正,做父亲的...
    育见阅读 508评论 0 0