基本操作

  1. // 查看版本
  2. $ node -v
  3. // 打印log
  4. console.log("hello world!")
  5. // 运行nodeJS程序
  6. node helloworld.js

Node.Js和Javascript

Javascript针对的是前端开发,是前端的Js:JavaScript = ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象)+DOM(一些操作页面元素的方法)+BOM(一些操作浏览器的方法)
Node.Js针对的是后端开发,是后端的Js:NodeJs = ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象) + os(操作系统) + file(文件系统) + net(网络系统) + database(数据库)
前端和后端的js相同点就是,他们的语言基础都是ECMAScript,只是他们所扩展的东西不同,前端需要操作页面元素,于是扩展了DOM,也需要操作浏览器,于是就扩展了BOM。而服务端的js则也是基于ECMAScript扩展出了服务端所需要的一些API,稍微了解后台的童鞋肯定知道,后台语音有操作系统的能力,于是扩展os,需要有操作文件的能力,于是扩展出file文件系统、需要操作网络,于是扩展出net网络系统,需要操作数据,于是要扩展出database的能力。
所以一些Javascript的基础语法和基础的库,在Node.Js中是通用的,在开发时,如果找不到Node.Js的相关资料,不妨参考Javascript的相关资料。

创建nodejs应用

在Flask框架下编写的Python后端代码,最终需要uwsgi作为Web服务器。在这里web应用和web服务器是分开的。
对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用和 Web 服务器完美的统一了。
node.js应用的组成部分:

  1. 引入required模块:我们可以使用 require 指令来载入 Node.js 模块。

    1. // 使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http
    2. var http = require("http");
  2. 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。 ```javascript //server.js

//请求(require)Node.js 自带的 http 模块,并且把它赋值给 http 变量。 var http = require(‘http’);

//调用 http 模块提供的函数: createServer 。这个函数会返回 一个对象, //这个对象有一个叫做 listen 的方法,这个方法有一个数值参数, 指定这个 HTTP 服务器监听的端口号 http.createServer(function (request, response) {

  1. // 发送 HTTP 头部
  2. // HTTP 状态值: 200 : OK
  3. // 内容类型: text/plain
  4. response.writeHead(200, {'Content-Type': 'text/plain'});
  5. // 发送响应数据 "Hello World"
  6. response.end('Hello World\n');

}).listen(8888);

// 终端打印如下信息 console.log(‘Server running at http://127.0.0.1:8888/‘);

// $ node server.js // Server running at http://127.0.0.1:8888/


3. **接收请求与响应请求** 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。

<a name="WpC9Z"></a>
## 回调函数
Node.js 异步编程的直接体现就是回调。异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。<br />例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
```javascript
//回调函数一般作为函数的最后一个参数出现:
function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }

阻塞代码实例

// main.js
var fs = require("fs");
var data = fs.readFileSync('intput.txt');
console.log(data.toString());
console.log(“happy end”)

// $ node main.js
// input txt content
// happy end

非阻塞代码实例

var fs = require("fs");
fs.readFile(input.txt', function(err, data) {
            if(err) return console.error(err);
                        console.log(data.toString());
            });
console.log("happy end")

// $ node main.js
// happy end
// input txt content

Node.js 几乎每一个 API 都是支持回调函数的。

Node.js事件循环

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。
Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
这个模型非常高效可扩展性非常强,因为 webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

Node.js - 图1