全栈开发–基础认识
JavaScript历史背景
JavaScript是在1995年Netscape一位名为Brendan Eich的工程师创造的,该公司为了宣传和推广得到考虑将LiveScript改成了JavaScript(尽管两者并没有共同点),后来一个欧洲标准化组织ECMA International 制定了JS标准。 对于JavaScript的API可以查阅MDN,w3school相对而言年久失修,MDN更新速度较快
Node.js
Node.js概述
首先使用的是Node.js,它有一个REPL(Read Evaluate Print Loop:输入-计算-输出-循环)环境,这个环境可以一个语句一个语句地编写代码,并且会即时地输出结果,就像对话一样,具有微信公众号自动回复的感觉。在你的代码不引发崩溃的情况下,计算机都会帮你正确地执行。
基本实例
Node是我们要用的后端的运行环境,同时它也提供了一种REPL的运行环境。
函数式编程简单应用:
[2,4,5].reduce(pre,cur)=>pre*cur,1)
注:[2,4,5]定义了一个数组array,array中有一个reduce方法,是将数组转换成一个元素的,reduce就是浓缩,(pre,cur)=>pre*cur表示的是下一个结果=先前的结果乘以当前值。
在最后的数值1表示的是初始值,亦即1*2*4*5。此为函数式编程的一个应用。
JS能够使用(pre,cur)=>pre*cur的方式直接定义一个函数,括号内的pre与cur都是它的参数,另外函数式编程还有以下几种形式:
1)F(x) = x + 1 就是(x) => x + 1 (在只有一个变量时亦可以写成x => x + 1来省略掉括号)
2)(x => y => x+y)(2)(3), 此为函数的柯里化,表示的形式等同于:
(function(x) {
return function(y) {
return x+y:
}
})(2)(3)
此外层函数的返回值是一个函数,这种函数被称之为高阶函数。
HTTP服务器
HTTP服务器的逻辑
ExpressJS是http服务器的编程框架,可以借助于其进行node的学习。
HTTP服务器的核心逻辑就是:
(request, response)=>void
换到C/C++的语言就是void handle(HTTPRequest req, HTTPResponse res){…}
整个后端就是req,res的处理了。
特别注意: 由于网络应用之间的通讯都是只能够传递字节,就是说,我们无法直接将一个数据结构(对象)发送给其他程序,而必须进行序列化和反序列化。
HTTP服务器的工作原理
HTTP服务器是一个遵循HTTP协议的守护运行处理进程。
首先HTTP服务器要长期监听一个端口,比如3000,因为它不知道何时会有请求传入。(端口是指操作系统开放给程序用于网络通讯的通道,一台计算机通常拥有上万个端口(0——65535))
当浏览器去访问这个3000端口时,会向里面扔一个请求,这相当于HTTP服务器的输入,这个输入保证符合HTTP协议规定的格式。
因为HTTP服务器的核心就是一个处理函数void handle(HTTPRequest req, HTTPResponse res),可以想象有一个程序,它把浏览器扔过来的HTTP请求,从字符串转换为一个复杂的对象当做req传入handle函数;同时构造一个空的res对象,在handle函数中不断地去修改它,最后把这个rep按照HTTP协议转化为字符串响应给浏览器。
注:将内存中的数据转化为字符串的过程称为串行化(Serialization),其反过程称之为反串行化(Deserialization)。串行化一般发生在程序的输出阶段,反串行化则一般发生在输入阶段。HTTP协议本质上定义了串行化的结构,只要双方遵守此通讯协议即可互相理解,而无关是否使用同一种编程语言。
前端的后台的工作任务:
前端的工作就是发出什么req,拿到res之后怎么渲染出来给用户看;后台的工作就是设置这个具体怎么通过req返回res。
handle逻辑的实现
实现一个简单的HTTP服务器的handle逻辑,并且让我们能够互相访问,在node的REPL中可以输入以下代码:
http.createServer((req,res)=>{res.write(‘Hello World!’);res.end();}.listen(3000);
然后在浏览器中访问http://localhost:3000
之后,你可以通过鉴别特定的请求来选择响应不同的内容,无论是访问数据库也好,访问文件系统也好,甚至访问其他的代理服务器(代理)也好,这一切完全可以由你来决定。
IP与域名
互联网寻址机制
现在IPv4协议(互联网协议Ver 4)较为常用,IPv4 的格式是XXX.XXX.XXX.XXX, 每个都是0~255,每一节都是256个,四节合计2^32中情况。
一般来说,公网IP地址可以标记一台计算机在全球广域网(www)中的逻辑位置,但绝大多数家庭计算机都没有公网IP,那么家庭计算机是怎么上网的呢?
ISP(网络服务器提供商),比如电信、移动、联通等公司,会动态分给你家一个公网IP。
IP的直接访问
任意一个IP,当我们访问此IP:3000时,你的计算机就会先在互联网上找到此IP对应的计算机,然后向它的3000端口投送http协议的请求,并且等待响应(此IP不一定上面有服务,即便有服务也不一定是3000端口,因此随便输入一个网址多半是除了报错就是不会有任何反馈)
域名
以baidu.com为例,在cmd中使用ping baidu.com 就可以看到百度的服务器的IP地址了:
那么怎么从域名(domain)找到IP,这就是DNS(域名服务器)的作用了。网络上有一类服务器专门用来存储域名到IP的映射记录:
上图有一个DNS设置,自动获得基本上就是“从网关处继承”。网络是一个树形结构,你的计算机节点的父节点就是网关。
如何查看网关呢?在cmd中可以使用ipconfig命令:
假设我的IP是AAA.AAA.AAA.AAA,我在我自己的机器上运行一个node http 服务器,监听3000端口,大家就可以通过访问http://AAA.AAA.AAA.AAA:3000来访问我的node服务器了。但是由于IP太难记了,因此需要搞一个域名,比如function-x.org,然后全球同步解析到某个IP上。大家访问function-x.org的时候,先会向DNS询问IP,问到了就去访问该IP。