Node.js入门知识

在使用node.js时,用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。

一、Nodejs认识

node.js应用组成:
引入 required 模块
可以使用 require 指令来载入 Node.js 模块
创建服务器
服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器
接收请求与响应请求
服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据
导出模块使用 module.exports
function add(a, b) {
    return a + b
}
 
function mul(a, b) {
    return a * b
}
 
module.exports = {
    add,
    mul
}

创建一个Nodejs应用例子:
引入模块
使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http
var http = require("http");
创建服务器
使用 http.createServer() 方法创建服务器
,并使用 listen 方法绑定 8888 端口。 
函数通过 request, response 参数来接收和响应数据。
var http = require('http');
//创建服务器
http.createServer(function (request, response) {
    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888);//指定监听端口为8888

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




二、NPM使用介绍

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:(也就是之前一直在用的那个)
  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
安装
install
有两种:
npm install express          # 本地安装
npm install express -g   # 全局安装
本地安装:
1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),
如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 
2. 可以通过 require() 来引入本地安装的包。
全局安装:
1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
2. 可以直接在命令行里使用。

可以使用$ npm list -g来查看所有全局安装的模块
如果要查看某个模块的版本号,可以使用命令 $ npm list grunt
package.json
package.json 位于模块的目录下,用于定义包的属性
  • name - 包名。

  • version - 包的版本号。

  • description - 包的描述。

  • homepage - 包的官网 url 。

  • author - 包的作者姓名。

  • contributors - 包的其他贡献者姓名。

  • dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。

  • repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。

  • main - main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。

  • keywords - 关键字


卸载 
uninstall
$ npm uninstall express

更新
$ npm update express
搜索
$ npm search express
创建模块
创建模块,package.json 文件是必不可少
可以使用NPM生成package.json 文件
完成生成步骤后,发布模块
$ npm publish
除此以外还有许多npm命令:
  • 使用npm help <command>可查看某条命令的详细帮助,例如npm help install。

  • 在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

  • 使用npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

  • 使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。

  • 使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

  • 使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。



三、交互式解释器

Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。
Node 自带了交互式解释器,可以很好的调试 Javascript 代码,可以执行以下任务:
  • 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。

  • 执行 - 执行输入的数据结构

  • 打印 - 输出结果

  • 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。

输入:
$ node > 
启动Node的终端,之后就可以输入间的表达式进行运算
可以执行:
简单的表达式运算
使用变量
变量声明需要使用 var 关键字,如果没有使用 var 关键字变量会直接打印出来。
多行表达式
支持输入多行表达式,这就有点类似 JavaScript
下划线(_)变量
可以使用下划线(_)获取上一个表达式的运算结果
常用的命令:
  • ctrl + c - 退出当前终端。

  • ctrl + c 按下两次 - 退出 Node REPL。

  • ctrl + d - 退出 Node REPL.

  • 向上/向下 键 - 查看输入的历史命令

  • tab 键 - 列出当前命令

  • .help - 列出使用命令

  • .break - 退出多行表达式

  • .clear - 退出多行表达式

  • .save filename - 保存当前的 Node REPL 会话到指定文件

  • .load filename - 载入当前 Node REPL 会话的文件内容。


四、Nodejs 回调函数

Nodejs也是一个异步编程。在Node中使用了大量的回调函数。Node 所有 API 都支持回调函数。
例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

在Node中,回调函数一般作为函数的最后一个参数,如:
var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");

五、Nodejs事件循环

Nodejs使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。


Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,如下实例:
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);
// 触发eventName事件
eventEmitter.emit('eventName');
或:
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
 
// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');
  
   // 触发 data_received 事件 
   eventEmitter.emit('data_received');
}
 
// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);
 
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});
 
// 触发 connection 事件 
eventEmitter.emit('connection');
 
console.log("程序执行完毕。");
从上面两段代码中可以看出,在nodejs语法中:
通过new events.EventEmitter() 得到实例化对象 对这个对象绑定事件——eventEmitter.on('connection', connectHandler) 以及触发事件——eventEmitter.emit('connection');

六、EventEmitter

上面提到用EventEmitter来绑定事件和监听,那么EventEmitter到底是什么呢?
它是events模块提供的唯一一个对象 EventEmitter 的核心就是事件触发与事件***功能的封装。
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

例子:
//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
    console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
    event.emit('some_event'); 
}, 1000); 
执行结果如下
一些方法
1 addListener(event, listener)
为指定事件添加一个聆听器
2 on(event, listener)
为指定事件注册一个***,接受一个字符串 event 和一个回调函数。
server.on('connection', function (stream) { console.log('someone connected!'); });
3 once(event, listener)
为指定事件注册一个单次***,即 ***最多只会触发一次,触发后立刻解除该***。
server.once('connection', function (stream) { console.log('Ah, we have our first user!'); });
4 removeListener(event, listener)

移除指定事件的某个***,***必须是该事件已经注册过的***。

它接受两个参数,第一个是事件名称,第二个是回调函数名称。

var callback = function(stream) { console.log('someone connected!'); }; server.on('connection', callback);  // ... server.removeListener('connection', callback);
5 removeAllListeners([event])
移除所有事件的所有***, 如果指定事件,则移除指定事件的所有***。
6 setMaxListeners(n)
默认情况下, EventEmitters 如果你添加的***超过 10 个就会输出警告信息。 
setMaxListeners 函数用于提高***的默认限制的数量。
7 listeners(event)
返回指定事件的***数组。
8 emit(event, [arg1], [arg2], [...])
按***的顺序执行执行每个***,如果事件有注册监听返回 true,否则返回 false。
EventEmitter中定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。当 error 被触发时,EventEmitter 规定如果没有响 应的***,Node.js 会把它当作异常,退出程序并输出错误信息。
因此,我们一般要为会触发 error 事件的对象设置***,避免遇到错误后整个程序崩溃。例如:
var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.emit('error'); 

大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。

七、Buffer
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

一般使用   Buffer.from  来创建Buffer对象







全部评论

相关推荐

不愿透露姓名的神秘牛友
08-05 14:11
点赞 评论 收藏
分享
06-18 08:36
湖南大学 Java
运营你豪哥:没啥拷打的 1.增加量化结果,现在有点缺效果数据 2.突出复杂性,现在的项目描述有点像功能清单,强调一下技术难点和解决方案。
不给转正的实习,你还去吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务