week1

一、什么是 TCP/IP 协议,什么是 HTTP 协议?

  • TCP/IP协议:指一组与互联网通信相关联的协议的集合。该协议族按层次划分为应用层、传输层、网络层、数据链路层,每层各负责在互联网通信中的一部分功能,各层次的功能按顺序递进,发送数据时从应用层到链路层,接收时反过来。它们之间通过接口交互,当某一层需要改动时,只需要保持接口不便,不需要更改其他层的部分。
  • HTTP协议:是TCP/IP协议族的应用层中的一种协议。该协议主要规定了客户端和服务器间请求和发送资源的过程中需要遵守的一系列规则,例如很重要的HTTP报文的格式和要求等。

二、如何理解网址、域名、IP、端口号的关系?

  • 网址即网络上资源的标准地址,又称URL。网址的构成中,包含域名或IP,以及端口号(除此之外还有协议、认证等其他部分)。比如http://11.11.11.11:80,或https://foo.com:8080/bar/,这两个地址分别包含了协议,IP/域名,端口号等部分。
  • 域名是为了方便人类输入和记忆而存在的,在web通讯中会通过DNS解析为IP地址,从而定位要访问资源的服务器,服务器的真实地址最终是以IP地址的形态存在的。
  • 端口号是客户端和服务端在通讯中使用的管道标记,通讯双方只有在同一端口,才能建立通讯。一台服务器有唯一的外网IP,但是可以有很多端口暴露出来使用不同协议进行通讯,完成各类工作,比如80端口常用于http通讯,22端口常用于ssh通讯等。

三、Git的基本操作和常用命令有哪些?

  • 基本操作:初始化仓库、把变更添加到暂存区、提交变更、回退仓库到以前的提交、对比版本差异、克隆远程仓库、提交到远程仓库、从远程仓库拉取、分支相关操作、使用标签等
  • 常用命令

    git init
    git add .
    git commit -m 'message'
    git status
    git log
    git reset --hard commmit_id
    git pull
    git push
    git checkout -b dev
    git branch dev
    git merge dev
    git tag v1.0
    git tag
    git push origin v1.0

四、Git和Github的区别和联系?

  • git是一个代码版本控制软件,它可以很好地建立并管理本地代码仓库,记录版本的变化,方便程序猿开发。
  • github是一个流行于全球的代码托管服务网站,当然在用github的过程中是离不开git的。本地的git仓库可以上传到github上托管、与全球的程序猿分享交流,也可以在github浏览到很多优秀的开放代码仓库中的项目。同时,在项目的协作开发中,可以使用github或同类的网站提供的线上仓库协作开发,提高效率。

五、JavaScript的原型是怎么回事?

由于JavaScript没有其他语言面向对象部分的类的概念,所以为了实现面向对象的继承这一重要功能,所以使用原型这个方法来实现继承的功能。

一个对象在创建后,自动拥有其所有上面层级的原型的属性和方法可以使用

六、JavaScript中的this指向哪里?

视情况而定。

  • 在单独的函数里的this指向全局对象window
  • 在一个对象内部的第一层函数中指向当前对象
  • 在对象内部的函数中再创建的函数里指向undefined(非strict模式则指向window),ES6新增的箭头函数中这种情况下this指向当前调用者对象

七、JavaScript中的异步如何理解?

JavaScript被设计为单线程的,这样有利于降低复杂度。但是完全单线程运行任务会引起阻塞,有必要引入异步。所以优化后的JavaScript可以包含同步任务和异步任务两部分。其中异步部分是由主线程单独开的子线程来完成,依然受到主线程的管理,所以并未改变JavaScript单线程的本质。

实现原理:主线程依然按照同步的方法顺序运行,但是在遇到DOM、Ajax、setTimeout等操作时,会单开线程执行,这些任务的回调函数会被放到一个消息队列里,待主线程空闲后,消息队列里的任务将按照先进先出的顺序开始执行。

回调函数、事件监听、发布订阅、Promises对象等都是可以实现异步操作的方法。

八、ES6和JavaScript的关系?

  • ESxxx是人为制定的标准,数字代表版本号,比如ES5.1、ES6等。
  • JavaScript是具体的一种解释型编程语言,是对标准的具体实现。

week2

一、使用 Koa 重新实现 The Node Beginner Book 中的 WEB 应用,上传到你的 Github 代码仓库,提交仓库地址,总结开发过程中遇到的问题和解决办法

  • 仓库地址:https://github.com/luabish/koa-node_beginner
  • 问题1:刚接触nodejs和koa,对包的返回值类型不熟悉,有的返回值是函数,在细节上容易忽略,导致调试时需要花一定时间排错。

    • 解决:查看报错,细心排查
  • 问题2:The Node Beginner Book 中用原生nodejs返回图片作为response时,用到了pipe方法,参数是之前传回来的response;换成koa框架后,尝试ctx.response作为pipe的参数无法正常显示图片。

    • 解决:查阅资料后,发现ctx.response对原生Node的response对象进行了封装,改动较大,并不具有原生response的很多特性。由于图片不大,所以可以直接把读到的图片数据传给ctx.response.body。
  • 问题3:初次正式学习nodejs,虽然以前用过几次npm安包,但是不明白npm管理包的具体特点。在尝试npm的使用过程中,遇到了一些warning和error。

    • 解决:通过查找资料,系统学习npm常用命令和特点,包括package.json的使用等;另外针对不同的warning和error,google搜索后尝试解决。

二、阐述 RESTful API 的优缺点

优点

  • 这套通用标准经过了全世界众多使用者的反复检验,相比于自己定制的新规则,更为可靠。
  • 资源之间相互链接:实现对服务器、空间等的种种跨越,使得资源更为开放,符合互联网的本质。
  • 使用通用的http方法:http方法类似于动词,资源类似于名词,在业务中可以很自然地结合。使用标准的HTTP方法对资源操作可以在开发中可以提高标准化程度,降低与业务的耦合程度,使逻辑更清晰,维护起来更容易。
  • 让更多人使用你的资源,满足多种需求。
  • 无状态通讯:节省服务器开销,使服务的规模更具可扩展性。

缺点

  • 实际业务中的有些操作,难以准确对应http方法的某一种,会引起选择上的困难。
  • 批量业务以及参数较复杂的业务中,使用不方便
  • 由于网络的不稳定性,有些方法可以反复提交直到满意(如get,put,delete等)多次提交同一个请求结果是一致的;但是有些方法反复提交可能造成与预期结果不符的后果(如post)。在restful的架构下,由于直接用http方法对资源进行操作,中间缺少一些对意外情况的控制,容易与预期不符。