学完了《Node入门》 ,做一下总结。
这是本很好的入门书,从简单的网络请求,堵塞、非堵塞,到上传一个简单的文件处理,比较接近(我想象中的)真实场景。并且讲解很清晰,定位也很简单,不是成为熟练者,而是成为新手中的熟练者。

开启一个网络服务

  1. 引入 node 内置模块 http ```json const http = require(“http”) const port = 8888

function onRequest(request, response) { response.writeHead(200, {‘content-type’: ‘text/html’}); response.write(‘hello’) // 结束 response.end() }

// 在设定好的端口启动服务 http.createServer(onRequest).listen(port) console.log(‘server has started in ‘ + port)

  1. <a name="0DXe0"></a>
  2. ## 模块的文件分层结构规则
  3. 1. 服务端的入口文件总是叫 **index.js **
  4. 1. 导入所有本地文件模块
  5. 1. 做 requestHandle 的绑定
  6. 1. 引用 server 暴露的 start 方法,传入 router 暴露的 route 方法,和绑定好的 handle map
  7. 2. 开启网络服务的代码放置于 server.js。
  8. 1. 开启本地服务
  9. 1. `url.parse` 请求url,分离其中的pathname
  10. 1. 做统一的头部处理(比如 `request.setEncoding("utf8")` )
  11. 1. 调用上下文中的 route 方法,传入上下文中的 handle map,和分离出来的pathname,透传 response request
  12. 3. 做路由分发的代码放置于 router.js
  13. 1. 根据 handle map 中是否有对应 pathname 做 key,做 404 返回判断
  14. 1. 非404,则调用对应的方法 `handle[pathnanme]` ,透传 response request
  15. 4. 实际运行处理的方法放置于 requestHandle.js
  16. <a name="4BvXX"></a>
  17. ## 实际项目目录
  18. ```json
  19. ├── index.js
  20. ├── node_modules
  21. ├── package-lock.json
  22. ├── package.json
  23. ├── requestHandlers.js
  24. ├── router.js
  25. └── server.js

堵塞、非堵塞

node.js 是单线程的,但是有句话叫「在node中除了代码,所有一切都是并行执行的」,也即是 Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理。它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
阻塞的定义为:在 Node.js 程序中,其它 JavaScript 语句的执行,必须等待一个非 JavaScript 操作完成。这是因为当 阻塞 发生时,事件循环无法继续运行 JavaScript。
而对于堵塞操作和非堵塞操作最简单的定义为,阻塞方法同步执行,非阻塞方法异步执行。
在 Node.js 标准库中的所有 I/O 方法都提供异步版本,非阻塞,并且接受回调函数。某些方法也有对应的阻塞版本,名字以 Sync 结尾。

额外api

  1. 通过 child_process 中的 exec 可以执行非堵塞的异步 Shell 操作
  2. fs.renameSync(oldPath, newPath)oldPath 文件重命名为 newPath 提供的路径名。 如果 newPath 已存在,则覆盖它。 这是一个堵塞操作。
  3. formidable 一个用于解析表单上传,尤其是文件上传的 node.js module,github