学完了《Node入门》 ,做一下总结。
这是本很好的入门书,从简单的网络请求,堵塞、非堵塞,到上传一个简单的文件处理,比较接近(我想象中的)真实场景。并且讲解很清晰,定位也很简单,不是成为熟练者,而是成为新手中的熟练者。
开启一个网络服务
- 引入 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)
<a name="0DXe0"></a>
## 模块的文件分层结构规则
1. 服务端的入口文件总是叫 **index.js **
1. 导入所有本地文件模块
1. 做 requestHandle 的绑定
1. 引用 server 暴露的 start 方法,传入 router 暴露的 route 方法,和绑定好的 handle map
2. 开启网络服务的代码放置于 server.js。
1. 开启本地服务
1. `url.parse` 请求url,分离其中的pathname
1. 做统一的头部处理(比如 `request.setEncoding("utf8")` )
1. 调用上下文中的 route 方法,传入上下文中的 handle map,和分离出来的pathname,透传 response request
3. 做路由分发的代码放置于 router.js
1. 根据 handle map 中是否有对应 pathname 做 key,做 404 返回判断
1. 非404,则调用对应的方法 `handle[pathnanme]` ,透传 response request
4. 实际运行处理的方法放置于 requestHandle.js
<a name="4BvXX"></a>
## 实际项目目录
```json
├── index.js
├── node_modules
├── package-lock.json
├── package.json
├── requestHandlers.js
├── router.js
└── server.js
堵塞、非堵塞
node.js 是单线程的,但是有句话叫「在node中除了代码,所有一切都是并行执行的」,也即是 Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理。它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
阻塞的定义为:在 Node.js 程序中,其它 JavaScript 语句的执行,必须等待一个非 JavaScript 操作完成。这是因为当 阻塞 发生时,事件循环无法继续运行 JavaScript。
而对于堵塞操作和非堵塞操作最简单的定义为,阻塞方法同步执行,非阻塞方法异步执行。
在 Node.js 标准库中的所有 I/O 方法都提供异步版本,非阻塞,并且接受回调函数。某些方法也有对应的阻塞版本,名字以 Sync 结尾。
额外api
- 通过
child_process
中的exec
可以执行非堵塞的异步 Shell 操作 fs.renameSync(oldPath, newPath)
把oldPath
文件重命名为newPath
提供的路径名。 如果newPath
已存在,则覆盖它。 这是一个堵塞操作。formidable
一个用于解析表单上传,尤其是文件上传的 node.js module,github