Node.JS学习笔记: 基础篇

基础概念

三大件: 浏览器,服务器,数据库
1. 浏览器
在这里主要是关注浏览器的作用是发送请求,比如发送一个HTTP请求:“喂,把/index.html的文档发给我。”至于如何发送请求,服务器又如何处理请求。这方面需要HTTP,TCP/IP的知识,这里就不细说了。
2. 服务器
根据《HTTP权威指南》描述,服务会做七件事:

步骤个人描述
建立连接就像有人打电话过来,决定接电话还是挂机
接收请求既然接电话了,那么就得搞清楚对方想干嘛,即读取一条报文
处理请求嗷,你要XX文件啊。我马上给你去找。即解释报文,并采取行动
访问资源然后,我开始翻桌子,柜子找啊找。那个“index.html”文件在哪里啊,在哪里?
构建响应找了一会儿后,嘿,找到咯或者是唉,没在我这儿要不你问问XX吧。即构建响应200,404,303之类的响应报文
发送响应哦,上一步应该是在脑袋里加工的步骤,这一步才是告诉对方找到了么。
记录事务处理过程接着记下笔记,今天,某某什么时候找我要文件,文件找到了,并发给了他。即日志记录

3. 数据库
这一部分我的学习,还未涉及。
在底层I/O操作,Node.JS是多线程的,只是对于开发者而言,所有的开发都是单线程的。

模块

导入模块:
var foo1 = require(‘./foo’); // 导入外部模块
var http = require(‘http’);
var data = require(‘./data.json’);
模块的路径解析规则是按照: $HOME/node_modules, /home/node_modules, ./node_modules
导出模块:exports, module.exports
前者是后者的一个引用,详细区别参考: exports 和 module.exports 的区别 - CNode技术社区

Event Loop

说到Event Loop就得提及异步。参考一是stackoverflow上频率高的JavaScript问题。其中提到 document.onload, setTimeout, $.post(jQuery), I/O操作这些都是异步操作,在异步操作中改变主线程的变量,在后续代码中console.log发现该变量还是undefined。
原因在于异步,代码是按照调用栈进行执行的.当遇到异步操作时,异步操作会被放进队列中。回调函数,在主调用栈执行完后,按照队列的顺序执行。
参考一: asynchronicity
参考二: Concurrency model and Event Loop - JavaScript | MDN
参考三: JavaScript 运行机制详解:再谈Event Loop - 阮一峰的网络日志

创建一个web应用

前面提到服务器需要做七件事,那么我们使用Node.JS创建服务器应用就得实现这些功能。
一个Node.JS的应用分为三个层次:
1. 应用逻辑层次
2. 公共模块层次
3. Node核心层次

以下为Node入门 » 一本全面的Node.js教程的学习笔记,这里没有直接转载代码。没有阅读该文章是无法弄清,下面乱七八糟的笔记的。

HTTP

创建一个web应用,我们要用到的核心层次HTTP模块。

var http = require('http');
http.createServer(function(req, res){
  res.end('Hello World');
}).listen(3000);

保存为server.js运行。
至于构建头文件,响应文件之类的,这里就不细说了。

对于上面的应用,不同URI响应是相同的。
于是考虑到,构建不同响应驱动的服务。

处理不同的请求

增加一个新模块为router.js,创建index.js主文件集中处理应用逻辑。
将各个模块导入index.js中

var server = require("./server");
var route = require('./router');

各个模块的执行顺序或者说调用栈分别为:index.js (route函数, handle对象)(前面括号里为传递的对象,后面省略此说明) -> server.js (handle, pathname) -> router.js -> requestHandlers.js
出栈: router.js 返回结果 -> server.js

事件响应,异步编程

运行前面完成web应用,当应用同时收到请求时,先来的请求会阻塞后来的请求。
为了防止阻塞,那么将请求转化为异步操作。
现在调用栈改为:server.js (handle, pathname, response) -> router.js (response) -> requestHandlers.js.
利用异步函数的回调来处理用户的响应。

处理POST

requestHandlers.js start()返回一个form页面
requestHandlers.js upload() 处理form。
方法一: 将post数据在server.js里面处理,传递值给requestHandlers.js
server.js 修改分为三步: 1) 数据编码 2)整合数据 3) 监听end事件,发送数据给router.js
在requestHandlers.js upload() 里处理数据

处理文件上传

使用模块formidable
在requestHandlers.js里面增加show(), 以及修改start()。
在server.js里面不再处理response,将response传递给requestHandlers.js 处理。

写到后面感觉到虎头蛇尾,基本是摘抄基本没啥干货。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值