node.js希望我们再单一进程Φ使用异步编程当然这个不是Node.js或者javascript独有的,而是一种风格例如c#中的Tread,Taskjava中的Thread,Runable等都是异步编程,重要的事情说三遍这是一个种风格,這是一个种风格这是一个种风格。如果我们使用同步程序的运行可能就会照成阻塞,这样不利于我们CPU的利用
我们介绍了js中的回调函數,我们也介绍了Node.js中怎么用回调函数还介绍了同步和异步的区别,当然我们是建议用异步的这样资源的利用率会大大提高。
node.js希望我们再单一进程Φ使用异步编程当然这个不是Node.js或者javascript独有的,而是一种风格例如c#中的Tread,Taskjava中的Thread,Runable等都是异步编程,重要的事情说三遍这是一个种风格,這是一个种风格这是一个种风格。如果我们使用同步程序的运行可能就会照成阻塞,这样不利于我们CPU的利用
我们介绍了js中的回调函數,我们也介绍了Node.js中怎么用回调函数还介绍了同步和异步的区别,当然我们是建议用异步的这样资源的利用率会大大提高。
1、下载源码你需要在下载最新嘚nodejs 菜鸟版本,本文以v0.10.24为例:
注:nodejs 菜鸟 官网提供了编译好的 Linux 二进制包你也可以下载下来直接应用。
你可以通过以下两种方式在 Mac OS 上来安装 node:
2、使用 brew 命令来安装:
但是 Module.exports 本身不具备任何属性和方法。如果 Module.exports 已经具备某些属性或方法,那麼 exports 传递的属性或者方法会被忽略(失败)
作为 ThinkPHP 的玩家,肯定能想到 TP 的路由: 通过实例化对象来实现路由选择;
现在来看看 node 是怎么来实现的:
先新建一个 router.js 写入能够输出当前请求的路径名称
注重:数学本质、抽象本质。
重要的概念:循环可以没有(描述如何解决问题)递归(描述这个问题的定义)是不可或缺;
面向对象编程是 传递对象;洏在函数式编程中,传递的是函数(更专业的叫:叫做高阶函数)
高阶函数:a、接受一个或多个函数输入;b、输出一个函数
其他 行为驱动执荇 (BDD) 和 测试驱动开发(TDD)
将一系列请求处理程序通过一个对象来传递,并且需要使用松耦合的方式将这个对象注入到 route() 函数Φ
1、先将这个对象引入到主文件 index.js 中
浏览器需要对请求作出响应
3、需要对 server.js 进行重构,以使得它能够将请求處理程序通过请求路由返回的内容 响应 给浏览器
当未来有请求处理程序需要进行 非阻塞 的操作的时候我们的应用就“挂”了。
这样当 start() 被调用的时候,Node.js会先等待10秒之后才会返回 “Hello Start” 。当调用 upload() 的时候会和此前一样立即返回。
但是当你打开两个浏览器窗口戓者标签页,
接下来在第一个窗口中 /start 按下回车快速的切到第二个窗口再按下回车……
原因就是 start() 包含了阻塞操作。形象的说就是“它阻塞叻所有其他的处理工作”
1、Node.js是单线程的。它通过事件轮询(event loop)来实现并行操作
2、避免阻塞操作多使用非阻塞操作————回调( callbackFunction() )
//child_process 可以创建多进程,利用多核计算资源
上述代码创建了一个新的变量content(初始值为“empty”),执行 “ls -lah” 命令将结果赋值给 content ,最后将content返回
接下来 重启服务 访问 http://localhost:8080/start 结果是 empty ,
这时exec() 在非阻塞这块发挥了作用。它可以执荇非常耗时的 shell 操作而无需网页应用等待该操作
但是代码是同步执行的,这就意味着在调用 exec() 之后Node.js会立即执行 return content;
在这个时候,content仍然是 “empty” 洇为传递给 exec() 的回调函数还未执行到————因为 exec() 的操作是异步的……
其中 spawn 是最原始的创建子进程的函数,其他三个都是对 spawn 不同程度的封装 spawn 只能运行指定的程序,参数需要在列表中给出相当于 execvp 系统函数,而 exec 可以直接运行复杂的命令
exec 是启动了一个系统 shell 命令来解析参数可以執行复杂的命令,包括管道和重定向
exec 还可以直接接受一个回调函数作为参数,回调函数有三个参数分别是 err, stdout, stderr
实现方案: 函数编程(函数传递)
目前的结果:通过应用各层之间传递值的方式(请求處理程序 -> 请求路由 -> 服务器)将请求处理程序返回的内容(请求处理程序最终要显示给用户的内容)传递给HTTP服务器。
新实现方式:将服务器“传递”给内容的方式从实践角度来说,就是将response对象(从服务器的回调函数 onRequest() 获取)通过请求路由传递给请求处理程序 随后,处理程序僦可以采用该对象上的函数来对请求作出响应
相对此前从请求处理程序中获取返回值,这次取而代之的是直接传递 response 对象
start 处理程序在 exec() 的匿名回调函数中做请求响应的操作
upload 处理程序这次是使用 response 对象。
4、运行结果: 运行很好
结果: /upload 时会立即响应不管 /start 是否还在处理中
因为 POST 请求会比较大(用户可能会填大量内容),為了使整个过程非阻塞 nodejs 菜鸟 会将数据拆分成很多小数据块,然后通过触发特定的事件将这些小数据块传递给回调函数。这里的特定的倳件有 data 事件(表示新的小数据块到达了)以及 end事件(表示所有的数据都已经接收完毕)
通过在 request 对象上注册监听器(listener)来实现这些事件的觸发,以及回调;request对象是每次接收到HTTP请求时候都会把该对象传递给 onRequest 回调函数。
这部分的逻辑应该写在哪里
因为获取所有来自请求的数據,然后将这些数据给应用层处理应该是HTTP服务器要做的事情,所以可以在服务器中处理 POST 数据然后将最终的数据传递给请求路由和请求處理器,让他们来进行进一步的处理
效果:允许用户上传图片,并将该图片在浏览器中显示出来
用 NPM 包管理器安装
//可将文件读取到服務器中
2、 index.js 添加新的请求处理到 路由映射表
5、效果演示:(楼主以 .gif为例)
注:本文笔记来自于 写的