前言 在node程序开发中时,经常需要打印调试日志。用的比较多的是debug模块,比如express框架中就用到了。下文简单举几个例子进行说明。文中相关代码示例,可在 这里 [https://github.com/chyingp/nodejs-learning-guide/tree/master/examples/2017.01.16-debug-log/debug] 找到。 备注:node在0.11.3版本也加入了util.debuglog()用于打印调试日志,使用方法跟debug模块大同小异。 基础例子 首先,安装 debug 模块。 npm install debug 使用很简单,运行node程序时,加上 DEBUG=app 环境变量即可。 /** * debug基础例子 */var debug = require('debug')('app'); // 运行 DEBUG=app node 01.js// 输出:app hello +0ms debug('hello'); 例子:命名空间 当项目程序变得复杂,我们需要对日志进行分类打印,debug支持命令空间,如下所示。
-
-
前言 在node程序开发中时,经常需要打印调试日志。用的比较多的是debug模块,比如express框架中就用到了。下文简单举几个例子进行说明。文中相关代码示例,可在 这里 [https://github.com/chyingp/nodejs-learning-guide/tree/master/examples/2017.01.16-debug-log/debug] 找到。 备注:node在0.11.3版本也加入了util.debuglog()用于打印调试日志,使用方法跟debug模块大同小异。 基础例子 首先,安装 debug 模块。 npm install debug 使用很简单,运行node程序时,加上 DEBUG=app 环境变量即可。 /** * debug基础例子 */var debug = require('debug')('app'); // 运行 DEBUG=app node 01.js// 输出:app hello +0ms debug('hello'); 例子:命名空间 当项目程序变得复杂,我们需要对日志进行分类打印,debug支持命令空间,如下所示。
-
模块概览 readline是个非常实用的模块。如名字所示,主要用来实现逐行读取,比如读取用户输入,或者读取文件内容。常见使用场景有下面几种,本文会逐一举例说明。本文相关代码可在笔者 github [https://github.com/chyingp/nodejs-learning-guide/tree/master/examples/2016.12.15-readline] 上找到。 * 文件逐行读取:比如说进行日志分析。 * 自动完成:比如输入npm,自动提示"help init install"。 * 命令行工具:比如npm init这种问答式的脚手架工具。 基础例子 先看个简单的例子,要求用户输入一个单词,然后自动转成大写 const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
-
写在前面 body-parser 是非常常用的一个 express 中间件,作用是对post请求的请求体进行解析。使用非常简单,以下两行代码已经覆盖了大部分的使用场景。 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); 本文从简单的例子出发,探究 body-parser 的内部实现。至于 body-parser 如何使用,感兴趣的同学可以参考 官方文档 [https://github.com/expressjs/body-parser/] 。 入门基础 在正式讲解前,我们先来看一个POST请求的报文,如下所示。 POST /test HTTP/1.1Host: 127.0.0.1:3000Content-Type: text/plain; charset=utf8Content-Encoding: gzipchyingp 其中需要我们注意的有 Content-Type 、 Content-Encoding 以及报文主体:
-
模块概览 nodejs的核心模块,基本上都是stream的的实例,比如process.stdout、http.clientRequest。 对于大部分的nodejs开发者来说,平常并不会直接用到stream模块,只需要了解stream的运行机制即可(非常重要)。 而对于想要实现自定义stream实例的开发者来说,就得好好研究stream的扩展API了,比如gulp的内部实现就大量用到了自定义的stream类型。 来个简单的例子镇楼,几行代码就实现了读取文件内容,并打印到控制台: const fs = require('fs'); fs.createReadStream('./sample.txt').pipe(process.stdout); STREAM分类 在nodejs中,有四种stream类型: * Readable:用来读取数据,比如 fs.createReadStream() 。 * Writable:用来写数据,比如 fs.createWriteStream() 。 * Duplex:可读+可写,比如 net.Socket() 。
-
模块简介 string_decoder 模块用于将Buffer转成对应的字符串。使用者通过调用 stringDecoder.write(buffer) ,可以获得buffer对应的字符串。 它的特殊之处在于,当传入的buffer不完整(比如三个字节的字符,只传入了两个),内部会维护一个internal buffer将不完整的字节cache住,等到使用者再次调用 stringDecoder.write(buffer) 传入剩余的字节,来拼成完整的字符。 这样可以有效避免buffer不完整带来的错误,对于很多场景,比如网络请求中的包体解析等,非常有用。 入门例子 这节分别演示了 decode.write(buffer) 、 decode.end([buffer]) 两个主要API的用法。 例子一: decoder.write(buffer) 调用传入了Buffer对象 <Buffer e4 bd a0> ,相应的返回了对应的字符串 你 ; const StringDecoder = require('string_decoder').StringDecoder;
-
模块概览 Buffer是node的核心模块,开发者可以利用它来处理二进制数据,比如文件流的读写、网络请求数据的处理等。 Buffer的API非常多,本文仅挑选 比较常用/容易理解 的API进行讲解,包括Buffer实例的创建、比较、连接、拷贝、查找、遍历、类型转换、截取、编码转换等。 创建 * new Buffer(array) * Buffer.alloc(length) * Buffer.allocUnsafe(length) * Buffer.from(array) 通过 NEW BUFFER(ARRAY) // Creates a new Buffer containing the ASCII bytes of the string 'buffer'const buf = new Buffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]); 验证下: var array = 'buffer'.split('').map(function(v){ return'0x' + v.charCodeAt(0).toString(16) });
-
N-API简介 Node.js 8.0 在2017年6月份发布,升级的特性中,包含了N-API。编写过或者使用过 node扩展的同学,不少都遇到过升级node版本,node扩展编译失败的情况。因为node扩展严重依赖于V8暴露的API,而node不同版本依赖的V8版本可能不同,一旦升级node版本,原先运行正常的node扩展就编译失败了。 这种情况对node生态圈无疑是不利的,N-API的引入正是试图改善这种情况的一种尝试。它跟底层JS引擎无关,只要N-API暴露的API足够稳定,那么node扩展的编写者就不用过分担忧node的升级问题。 如何使用N-API 先强调一点,N-API并不是对原有node扩展实现方式的替代,它只是提供了一系列底层无关的API,来帮助开发者编写跨版本的node扩展。至于如何编写、编译、使用扩展,跟原来的差不多。 本文会从一个超级简单的例子,简单介绍N-API的使用,包括环境准备、编写扩展、编译、运行几个步骤。 备注:当前N-API还处于试验阶段,官方文档提供的例子都是有问题的,如用于生产环境需格外谨慎。 1、环境准备
-
[https://raw.githubusercontent.com/wengwengweng/thrift-example/master/thrift_logo.png] 项目介绍 项目地址 [https://github.com/wengwengweng/thrift-example] 这个项目用来帮助那些对thrift感兴趣的前端们上手thrift, 你可以把它认为是一个简易的使用案例或是指南, 毕竟thrift的官方文档真的很简单... 为什么使用THRIFT Thrift是一种接口描述语言和二进制通讯协议, 可以用来进行服务端与服务端的通信。 与http相比他有很多优点: * 跨语言,自动生成不同语言的接口代码,这在开发中用处很大,可以使你在联调之前就确保传输的参数类型和字段没有问题,大大减少bug出现率。 * 与HTTP相比更加紧凑,但同时可扩展性也很强,支持加密、非阻塞、异步等功能。 * 数据传输效率高,负载低,支持多种序列化技术。 一些劣势: * 接口代码根据IDL自动生成,当数据结构变化时,需重新编辑IDL文件,生成代码。( 这一点可以通过写脚本解决这个问题 )
-
关于 一直考虑写一个功能齐全的完整Nodejs项目,但苦于没有找到合适的类型,而且后台系统无法直观的感受到,需要有一个前台项目配合,因此迟迟没有动笔。恰好前一段时间开源了一个 vue前端项目 [https://github.com/bailicangdu/vue2-elm] ,便以此为契机构筑了后台系统。 因为前端项目是根据饿了么官网接口写的,所以后台系统也保持了和官网一致的API接口。 整个项目分为两部分:前台项目接口、后台管理接口,共60多个。涉及登陆、注册、添加商品、商品展示、筛选排序、购物车、下单、用户中心等,构成一个完整的流程,基本完成一个外卖平台所需的基础功能。 源码地址: https://github.com/bailicangdu/node-elm [https://github.com/bailicangdu/node-elm] 效果演示 (可在后台管理系统添加商铺,食品等数据,并在前端地址查看效果) 前端网址 前端网址戳这里 (请用chrome手机模式预览)
-
简介 MD5(Message-Digest Algorithm)是计算机安全领域广泛使用的散列函数(又称哈希算法、摘要算法),主要用来确保消息的完整和一致性。常见的应用场景有密码保护、下载文件校验等。 本文先对MD5的特点与应用进行简要概述,接着重点介绍MD5在密码保护场景下的应用,最后通过例子对MD5碰撞进行简单介绍。 特点 1. 运算速度快:对 jquery.js 求md5值,57254个字符,耗时1.907ms 2. 输出长度固定:输入长度不固定,输出长度固定(128位)。 3. 运算不可逆:已知运算结果的情况下,无法通过通过逆运算得到原始字符串。 4. 高度离散:输入的微小变化,可导致运算结果差异巨大。 5. 弱碰撞性:不同输入的散列值可能相同。 应用场景 1. 文件完整性校验:比如从网上下载一个软件,一般网站都会将软件的md5值附在网页上,用户下载完软件后,可对下载到本地的软件进行md5运算,然后跟网站上的md5值进行对比,确保下载的软件是完整的(或正确的)
-
PM2 模块 PM2模块是通过PM2来安装和管理,代码可以托管在NPM中。任何人都可以创建和发布一个PM2模块,可以是日志模块、http代理模块、负载均衡模块、DNS服务器模块或任何类型的实用程序。 管理模块 管理PM2模块是非常简单的: # Install $ pm2 install <module-name> # Update a module $ pm2 install <module-name> # Install a module from GitHub (username/repository) $ pm2 install pm2-hive/pm2-docker # Force module restart $ pm2 restart <module-name> # Get more informations $ pm2 describe <module-name> # Install a module in dev mode from local folder $ pm2 install . # Generate a module boilerplate