NodeJs apiDoc

apiDoc

全局安装,方便用命令创建文档

1
npm install apidoc -g

配置

在你的项目根目录下新建apidoc.json文件,该文件描述了项目对外提供接口的概要信息如名称、版本、描述、文档打开时浏览器显示标题和接口缺省访问地址。
apidoc.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"name": "xxx Api",
"version": "1.0.0",
"description": "xxx Api Documentation",
"title": "xxx",
"url" : "http://域名/api/v1",
"sampleUrl": "http://域名/api/v1",

"template": {
"withCompare": true,
"withGenerator": true,
"forceLanguage":"en"
},
//顺序、若有需要可配置(books, student,xxx) Resources Name
"order": ["xxx","xxx"]
}

Sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Get Access Token
* @api {POST} /token GetAccessToken
* @apiDescription Generate a token that can be passed with each API request.
* @apiName GetAccessToken
* @apiPermission API User
* @apiParam (Parameters) {String} username username
* @apiParam (Parameters) {String} password password
* @apiParamExample {json} Sample (Request body formats: text/plain, application/x-www-form-urlencoded, text/json, application/json) :
* {
* "username": "your accont",
* "password": "your password"
* }
* @apiSampleRequest off
* @apiSuccessExample {json} Response (Response body formats: application/json, text/json):
* Success Response :
* Status: 200 OK
* {
* "status": "success",
* "message": "Authentication successful.",
* "data": {
* "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6Ikpxxxxx.xxxxx2VybmFtZSI6InNsIiwiaWF0IjoxNTQ1MTkyMzY4LCJleHAiOjE1NDUxOTI4NDh9.xxxxxxgS1Yw8rNRD31p97A7fdWvmkrXxo3llMJowX7U"
* }
* }
* Or
* Bad Response:
* Status: 400
* {
* "status": "failure",
* "message": "Authentication failed. Please provide a correct username or password."
* }
* @apiGroup Token
* @apiVersion 1.0.0
*/

生成

文档初始化或发生改变时,在应用程序根目录执行相应命令
以此项目为例:

apidoc -i api/v1 -o public/apiDoc

1
2
3
4
-i input
-o output

指定文件夹路径

具体注释写法参照官网解释:
http://apidocjs.com/#run

public/apiDoc内文件不用上传到代码管理中
可直接执行npm run doc命令自动生成

NodeJs插件

lodash

采用延迟计算,意味着我们的链式方法在显式或者隐式的value()调用之前是不会执行的,
因此lodash可以进行shortcut(捷径) fusion(融合)这样的优化,
通过合并链式大大降低迭代的次数,从而大大提升其执行性能。

cors

实现跨域的功能

helmet

是一个保护Node.JS应用的安全项目
一些著名的对Web攻击有XSS跨站脚本, 脚本注入 clickjacking
以及各种非安全的请求等对Node.js的Web应用构成各种威胁,
使用Helmet能帮助你的应用避免这些攻击。

csurf

跨站请求伪造

colors

终端着色插件

express-validator

校验插件
npm install –save express-validator

uuid GUID插件

npm install –save node-uuid

NodeJs基础

NodeJs基础

Node 核心

Node核心:

  • 非阻塞;  
  • 单线程;  
  • 事件驱动。

NodeJs回调

回调函数:异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
Node 使用了大量的回调函数,Node所有API都支持回调函数。未使用回调函数可能会产生阻塞。

阻塞:

1
2
3
4
var fs = require("fs");
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序执行结束!");

非阻塞:

1
2
3
4
5
6
7
8
var fs = require("fs");

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

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

NodeJs事件

事件驱动程序。当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

模块化

NodeJs 提供了两个命令,require 和 exports
exports是模块中公开的接口,require用于从外部获取接口,其实可以通过如此获取到所需模块的一个对象。

模块的加载顺序

一)从文件模块缓存中加载:

尽管原生模块与文件模块的优先级不同,但是都会优先于从文件模块的缓存中加载已经存在的模块。

二)从原生模块加载:

原生模块的优先级仅次于文件模块缓存的优先级。
require 方法在解析文件名之后,优先检查模块是否在原生模块列表中。
以http模块为例,尽管在目录下存在一个 http/http.js/http.node/http.json 文件,
require(“http”) 都不会从这些文件中加载,而是从原生模块中加载。
原生模块也有一个缓存区,同样也是优先从缓存区加载。
如果缓存区没有被加载过,则调用原生模块的加载方式进行加载和执行。

三)从文件加载:

当文件模块缓存中不存在,而且不是原生模块的时候,
Node.js 会解析 require 方法传入的参数,并从文件系统中加载实际的文件,
require方法接受以下几种参数的传递:

  • http、fs、path等,原生模块。
  • ./mod或../mod,相对路径的文件模块。
  • /pathtomodule/mod,绝对路径的文件模块。
  • mod,非原生模块的文件模块。

NodeJs Buffer

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

NodeJs Stream

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。
例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

Node.js,Stream 有四种流类型:

  • Readable - 可读操作。
  • Writable - 可写操作。
  • Duplex - 可读可写操作.
  • Transform - 操作被写入数据,然后读出结果。

所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

  • data - 当有数据可读时触发。
  • end - 没有更多的数据可读时触发。
  • error - 在接收和写入过程中发生错误时触发。
  • finish - 所有数据已被写入到底层系统时触发。

NodeJs OS模块:(基本的系统操作函数)

  • os.tmpdir() 返回操作系统的默认临时文件夹。
  • os.endianness() 返回 CPU 的字节序,可能的是 “BE” 或 “LE”。
  • os.hostname() 返回操作系统的主机名。
  • os.type() 返回操作系统名
  • os.platform() 返回操作系统名
  • os.arch() 返回操作系统 CPU 架构,可能的值有 “x64”、”arm” 和 “ia32”。
  • os.release() 返回操作系统的发行版本。
  • os.uptime() 返回操作系统运行的时间,以秒为单位。
  • os.loadavg() 返回一个包含 1、5、15 分钟平均负载的数组。
  • os.totalmem() 返回系统内存总量,单位为字节。
  • os.freemem() 返回操作系统空闲内存量,单位是字节。
  • os.cpus() 返回一个对象数组,包含所安装的每个 CPU/内核的信息:型号、速度(单位 MHz)、时间(一个包含 user、nice、sys、idle 和 irq 所使用 CPU/内核毫秒数的对象)。
  • os.networkInterfaces() 获得网络接口列表。

NodeJs Path 模块:(提供了处理和转换文件路的工具)

  • path.normalize(p) 规范化路径,注意’..’ 和 ‘.’。
  • path.join([path1][, path2][, …]) 用于连接路径。该方法的主要用途在于,会正确使用当前系统的路径分隔符,Unix系统是”/“,Windows系统是”\”。
  • path.resolve([from …], to) 将 to 参数解析为绝对路径。
  • path.isAbsolute(path) 判断参数 path 是否是绝对路径。
  • path.relative(from, to) 用于将相对路径转为绝对路径。
  • path.dirname(p) 返回路径中代表文件夹的部分,同 Unix 的dirname 命令类似。
  • path.basename(p[, ext]) 返回路径中的最后一部分。同 Unix 命令 bashname 类似。
  • path.extname(p) 返回路径中文件的后缀名,即路径中最后一个’.’之后的部分。如果一个路径中并不包含’.’或该路径只包含一个’.’ 且这个’.’为路径的第一个字符,则此命令返回空字符串。
  • path.parse(pathString) 返回路径字符串的对象。
  • path.format(pathObject) 从对象中返回路径字符串,和 path.parse 相反。

其他

NodeJs Net 模块:(提供了用于底层的网络通信的小工具,包含了创建服务器/客户端的方法)

NodeJs DNS 模块:(用于解析域名)

NodeJs Express框架:

请求和响应:
app.get(‘/‘, function (req, res) {
// –
})

Express 应用使用回调函数的参数: request和response对象来处理请求和响应的数据。

Request 对象:

request对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:

  • (1)req.app:当callback为外部文件时,用req.app访问express的实例
  • (2)req.baseUrl:获取路由当前安装的URL路径
  • (3)req.body / req.cookies:获得「请求主体」/ Cookies
  • (4)req.fresh / req.stale:判断请求是否还「新鲜」
  • (5)req.hostname / req.ip:获取主机名和IP地址
  • (6)req.originalUrl:获取原始请求URL
  • (7)req.params:获取路由的parameters
  • (8)req.path:获取请求路径
  • (9)req.protocol:获取协议类型
  • (10)req.query:获取URL的查询参数串
  • (11)req.route:获取当前匹配的路由
  • (12)req.subdomains:获取子域名
  • (13)req.accepts():检查可接受的请求的文档类型
  • (14)req.acceptsCharsets /
    req.acceptsEncodings / 
    req.acceptsLanguages:返回指定字符集的第一个可接受字符编码
    
  • (15)req.get():获取指定的HTTP请求头
  • (16)req.is():判断请求头Content-Type的MIME类型

Reponse 对象:

  • (1)res.app:同req.app一样
  • (2)res.append():追加指定HTTP头
  • (3)res.set(): 在res.append()后将重置之前设置的头
  • (4)res.cookie(name,value [,option]):设置Cookie
  • opition: domain / expires / httpOnly / maxAge / path / secure / signed
  • (5)res.clearCookie():清除Cookie
  • (6)res.download():传送指定路径的文件
  • (7)res.get():返回指定的HTTP头
  • (8)res.json():传送JSON响应
  • (9)res.jsonp():传送JSONP响应
  • (10)res.location():只设置响应的Location HTTP头,不设置状态码或者close response
  • (11)res.redirect():设置响应的Location HTTP头,并且设置状态码302
  • (12)res.send():传送HTTP响应
  • (13)res.sendFile(path [,options] [,fn]):
  • 传送指定路径的文件 -会自动根据文件extension设定Content-Type
  • (14)res.set():设置HTTP头,传入object可以一次设置多个头
  • (15)res.status():设置HTTP状态码
  • (16)res.type():设置Content-Type的MIME类型