nodejs
pengpengzhou
主要学习语言Java,Nodejs,Go
展开
-
Go Nodejs Java Aes 128 CBC 加密解密结果保持一致
在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性。下面列出了Go,Nodejs,Java 的 Aes-128-Cbc的加密解密算法,它们的加解密结果是一致的。CBC比ECB加密强度更大,更难破解。Go 1.15package mainimport ( "bytes" "crypto/aes" "crypto/cipher" "encoding/hex"原创 2021-07-30 17:32:05 · 1062 阅读 · 0 评论 -
Go Nodejs Java Aes 128 ECB加密解密结果保持一致
在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性。下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法:Gopackage mainimport ( "crypto/aes" "crypto/md5" "encoding/hex" "fmt")func generateMd5Key(str string) []byte {原创 2021-07-30 14:37:54 · 1133 阅读 · 0 评论 -
Nodejs redis客户端multi命令批量操作
multi支持所有client支持的命令,如multi.set将set命令参数(包括回调函数)加入命令队列,由multi.exec最终执行命令队列并依次调用队列中的回调函数,最后再调用multi.exec自己的回调函数。const redis = require("redis");const client = redis.createClient(6379, "127.0.0.1");// start a separate multi command queueconst multi = clie原创 2021-07-05 13:31:33 · 986 阅读 · 0 评论 -
Nodejs: redis客户端通过mset方法一次性批量写入多个key的值
nodejs的redis客户端支持mset一次性写入多个键值对,示例如下:redis-mset.jsconst redis = require("redis");const client = redis.createClient(6379, "127.0.0.1");client.mset(["key1", 100, "key2", 50, "key3", 60], function(err, reply) { if (err) { console.原创 2021-07-05 13:20:46 · 1811 阅读 · 0 评论 -
Nodejs: TypeError: The super constructor to “inherits“ must not be null or undefined
最近在用statsd时,这一句util.inherits(Configurator, process.EventEmitter); 报错:“TypeError: The super constructor to “inherits” must not be null or undefined”原因是较新的Nodejs版版里process没有EventEmitter这个对象,解决办法是在调用util.inherits之前先给process创建一个EventEmitter对象如下所示:process.Eve原创 2021-06-15 15:29:39 · 287 阅读 · 1 评论 -
thrift协议0.14.1在Nodejs和Go语言之间的跨语言调用的兼容性测试
thrift协议本来按设计理念来说应该是能够跨语言调用的,但实际测试了一下,Nodejs和Go之间并不能通过thrift-0.14.1协议进行跨语言调用,具体用例见《Go语言:thrift协议0.14.1的使用示例》和《Nodejs thrift协议0.14.1的使用示例》。Go的thrift客户端把context.Context引入到RPC函数,而nodejs并没有相应的context,这可能是导致双方不能正常调用的原因。...原创 2021-03-16 16:17:28 · 462 阅读 · 0 评论 -
Nodejs thrift协议0.14.1的使用示例
echo.thriftnamespace go echostruct EchoReq { 1: required string msg}struct EchoRes { 1: required string msg}service Echo { EchoRes echo(1: EchoReq req)}如果是win10的话直接下载exe并执行以下命令即可生成js代码,其它系统可能需要编译安装thrift代码生成器。thrift-0.14.1.ex.原创 2021-03-16 16:03:45 · 849 阅读 · 0 评论 -
Nodejs Redis客户端报错Error: OOM command not allowed when used memory > ‘maxmemory‘
标题中的错误是由Redis服务端返回给客户端的,属于服务端错误。原因是Redis服务的内存占用已经达到maxmemory所设的限定,并且Eviction policies(由maxmemory-policy参数设置)没有删除掉足够多的key来释放空间。由上述错误可能会进而引发Redis客户端报如下错误:Error: TypeError: Cannot read property 'length' of undefined at Command.callback (/usr/local/pro..原创 2021-01-07 13:56:17 · 880 阅读 · 0 评论 -
Nodejs: 读写二进制文件
最简单的方法是用fs的writeFileSync和readFileSync如下所示:var fs = require('fs');var crypto = require('crypto');//产生32位随机字节var wbuf = crypto.randomBytes(32);console.log(wbuf);try { //把32位随机字节写到文件"binaryfile" fs.writeFileSync("binaryfile", wbuf);.原创 2020-09-29 10:26:31 · 9449 阅读 · 0 评论 -
Nodejs:http服务端keep-alive超时设置
Nodejs里用于控制http服务端的KeepAlive超时的函数setTimeout:server.setTimeout([msecs][, callback])示例代码server.js:const http = require('http')const port = 8889const host = "127.0.0.1"const print = function(msg){ t = new Date(); console.log(t + '原创 2020-09-15 17:20:11 · 5574 阅读 · 0 评论 -
Nodejs: redis客户端通过mget方法一次性批量读取多个key的值
redis客户端一次性批量读入multiple keys对应的值可以减少网络操作。代码如下:const redis = require("redis");const client = redis.createClient();client.on("error", function(error) { console.error(error);});client.set("key1", "value1", redis.print);client.set("key2", "v.原创 2020-08-21 11:03:44 · 3059 阅读 · 0 评论 -
Nodejs: redis客户端报错 Redis connection gone from end event
错误的stack trace:Error: Error: Redis connection gone from end event. at RedisClient.flush_and_error (/server/node_modules/redis/index.js:142:13) at RedisClient.connection_gone (/server/node_modules/redis/index.js:475:10) at Socket.<anonymou原创 2020-07-30 11:15:09 · 462 阅读 · 0 评论 -
Nodejs: protobuf 报错 TypeError: this.$set is not a function
在使用protobufjs包的时候,每次创建对象的时候都必须用关键字“new”,否则就会报“TypeError: this.$set is not a function”如下面这段代码 "var protoIpInfo = Model.IpInfo({...})" 就应该是"var protoIpInfo = new Model.IpInfo({...})" 。message IpInfo{ required uint32 ipStart = 1; required uint32 .原创 2020-07-20 14:14:15 · 2369 阅读 · 0 评论 -
Nodejs: MemoryUsage()返回的rss,heapTotal,heapUsed,external的含义和区别
process.memoryUsage()返回当前进程的内存使用情况,但不包括子进程。子进程的内存使用情况需要在子进程中单独调用process.memoryUsage()。该函数返回4个参数,含义及差别如下:rss: (Resident Set Size)操作系统分配给进程的总的内存大小。 heapTotal:堆的总大小,包括3个部分, 已分配的内存,用于对象的创建和存储,对应于heapUsed 未分配的但可用于分配的内存 未分配的但不能分配的内存,例如在垃圾收集(GC)之前对象之间的内原创 2020-06-17 17:00:37 · 6843 阅读 · 0 评论 -
Nodejs:记一次生产环境下内存溢出故障的排查过程(FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out)
问题发现:这个问题最早是在系统日志输出里发现的,报“FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out”,服务并没有退出,仍然在响应请求,只是响应速度很慢。<--- Last few GCs --->[23246:0x3d1ca00] 269438356 ms: Mark-sweep 1407.7 (1460.2) -> 1407.7 (1460.2) MB, 1198.9 / 0.原创 2020-06-05 16:05:32 · 2119 阅读 · 0 评论 -
Nodejs: Buffer报错argument must be an Array of Buffer or Uint8Array instances
最近项目有个需求需要在和第三方API接口进行交互时,在JSON字符串最前面加上16个字节的签名字节,为了简化问题忽略JSON以及16个字节的具体取值。错误代码:buff = Buffer.from('abcd012', 'utf8');arr = [];crypted = new Buffer(16) + buff;console.log(typeof crypted);console.log(crypted);console.log(crypted.length);arr.push原创 2020-06-01 16:40:59 · 5743 阅读 · 0 评论 -
Nodejs版本升级导致UTF8中文字符串的md5取值前后不一致的问题
Nodejs的版本从4.x升级到8.x的过程中遇到一个问题:含有中文的UTF8字符串的md5取值在升级前后不一致。研究了一下,发现Nodejs从6.x开始对crypto做了一个改进,直接支持UTF8二进制,不用单独再处理中文了,“buf.toString("binary")”这一句已经不需要了,加了反而会错。在5.x及以下版本,用下面这个函数md5中文是对的:getMD5Chn = function(str) { var buf, shasum; buf = new Buffer(原创 2020-05-22 13:57:53 · 427 阅读 · 0 评论 -
Nodejs: 整形数字转IPv6
IPv6的整形值已经超出nodejs的整形存储范围,所以这里用第三方包“jsbn”来存储。其转换函数如下,这里没有考虑0的压缩。另外需要注意的是0-4294967295之间的整数既可以转换成IPv4也可以转换成IPv6,而且同一个整数可能在IPv4和IPv6里对应着不同的地域,因此不能给两者抽象出一个统一的转换函数。var jsbn = require('jsbn');var int2ipv6 = function(numasstr) { var bi = new jsbn.BigIn原创 2020-05-13 09:43:51 · 549 阅读 · 0 评论 -
Nodejs: net.isIP()使用示例及对常见IP字符串的验证
net.isIP(input)使用示例及对常见IP字符串的验证如下,net.isIPv4,net.isIPv6两个函数的用法和net.isIP一样,只是返回变成true/false。> var net = require('net')undefined> net.isIP("10.1.7.23")4> net.isIP("2001:024f:ffff:ffff:ffff:ffff:ffff:fff1")6> net.isIP("2001:024f:ffff:ffff原创 2020-05-11 11:26:30 · 887 阅读 · 0 评论 -
Nodejs IPv6解析转换成BigInteger整形数字
IpV6是128bit,必须用BigInt才能保存,而nodejs从v10.4.1才开始支持BigInt。一般的数字类型不能用的原因是会被表示为科学计数法,而且后面若干位会被置为0。转换函数:var Ipv6ToBigInt = function(ipv6) { var groups = ipv6.split(":"); var sum = BigInt(0); for (var i = 0; i < groups.length; i++) { sum原创 2020-05-08 17:40:21 · 1066 阅读 · 0 评论 -
Nodejs Protobuf协议报错TypeError: Illegal str: Length not a multiple of 4
protobufjs模块要求bytes类型的字段在传入前需要做base64转换,否则会报上述错误。示例如下:message WiFi { optional bytes mac = 1; };#正确wiFi.set("mac", new Buffer("089E01BFAC64").toString("base64"))#错误 报TypeError: Illegal st...原创 2020-03-26 16:58:29 · 418 阅读 · 0 评论 -
Nodejs 字符串string转字节数组byte[]
Nodejs目前还没有原生支持从string到byte[]的转换,需要自己写。可以给String对象加一个原型函数,如下示例:String.prototype.toBytes = function(encoding){ var bytes = []; var buff = new Buffer(this, encoding); for(var i= 0; i< buff.leng...原创 2020-03-26 14:19:22 · 12025 阅读 · 0 评论 -
获取本地时区和UTC(格林威治)时区之间的时差 Go , Java , Nodejs(javascript)
中国的时区比UTC时区快8个小时,为了避免手工配置这个数字,可以通过程序动态获取:Gopackage mainimport ( "fmt" "time")func main() { name, offset := time.Now().Zone() fmt.Printf("Local Zone name: %v, offset to UTC(seconds)...原创 2020-03-10 14:53:58 · 2940 阅读 · 0 评论 -
采用nodejs+phantom对grafana整个页面截图
把grafana整个页面定时保存为图片既方便发送邮件日报又方便存档。以下方式在grafana-6.6.1上亲测可用。1. 修改配置文件允许匿名访问(默认文件conf/defaults.ini)#################################### Anonymous Auth ######################[auth.anonymous]# enabl...原创 2020-02-21 15:51:42 · 1473 阅读 · 0 评论 -
Nodejs客户端工具forever使用--killSignal参数优雅退出(Graceful Exit)
官方文档的帮助说明有--killSignal参数的描述,但具体怎么用没有说。实际上,这个参数应该加在start命令后面,如果加在stop命令后则不会有任何反应。forever start --killSignal=SIGTERM -a -l ${LOG_PATH}/forever.log -o ${LOG_PATH}/out.log -e ${LOG_PATH}/err.log serv...原创 2020-02-13 14:31:56 · 833 阅读 · 0 评论 -
nodejs c++ addon插件的应用场景
高精度计算,如浮点数 多线程并行计算 直接操作硬件 在Nodejs里调用已有的C++的包,而Nodejs自身没有对应的包或者效率不如C++,如视频格式转换。 在多语言开发的项目中,需要用开发可被多种语言共同使用的类库。Nodejs,Java,Python,Go都支持调用C++的类库。...原创 2020-02-10 17:04:09 · 493 阅读 · 0 评论 -
nodejs npm版本3把所有依赖包及子依赖包全部安装在node_modules根目录的问题
npm从版本3开始把所有依赖包及其子依赖包全部安装在node_modules根目录。文件夹特别多,显得有点混乱,不太好管理。Your dependencies will now be installed maximally flat. Insofar as is possible, all of your dependencies, and their dependencies, and TH...原创 2019-12-31 17:12:21 · 2813 阅读 · 1 评论 -
Nodejs cluster报错Error [ERR_IPC_CHANNEL_CLOSED]: channel closed
这个错误是在Master进程向子进程send消息时发现pipe已经关闭了的情况下由Master进程报出来的。2019-12-16 14:33:02,pid-170096, Error [ERR_IPC_CHANNEL_CLOSED]: channel closed at ChildProcess.target.send (internal/child_process.js:578:1...原创 2019-12-18 17:18:48 · 6474 阅读 · 1 评论 -
Nodejs生产环境稳定的版本及async/await的稳定版本
一般进入Maintenance LTS(Long Term Support)阶段的版本比较适合于生产环境。从下图来看当前生产环境可用的最高版本是6.x。而对Async/Await的支持是从v7.6.0开始的,所以现在还不适合在生产环境使用。另:LTS版本一般是偶数版本In fact, the next LTS release is chosen from a specific point ...原创 2018-09-04 14:27:21 · 8858 阅读 · 0 评论 -
CoffeeScript 2对async/await的支持及用法示例
CoffeeScript 2版本增加了对async/await的支持,官方文档。注意使用await的函数前面不用加async,CoffeeScript编译的时候会自动添加。示例代码(CoffeeScript version 2.3.1/nodejs v8.11.4):bluebird = require('bluebird')sleep1 = (callback)-> ...原创 2018-09-05 16:03:02 · 900 阅读 · 0 评论 -
nodejs await 并发性能测试/负载测试
利用Grinder对使用await的web服务做负载测试,并以只使用callback的web服务作为对照.测试环境: Linux Centos虚拟机 单核 测试参数: grinder.processes=7 grinder.thread = 3 grinder.runs=600 测试结果:callback和await在并发性能上并无显著差异 call...原创 2018-09-07 14:31:42 · 4725 阅读 · 0 评论 -
nginx nodejs 502 upstream prematurely closed connection while reading response header from upstream
问题描述:在nginx + nodejs的应用场景中,请求URL中如果含有不能进行编码的非法字符则nodejs http server会直接socket hang up断开连接,导致nginx报错"upstream prematurely closed connection while reading response header from upstream", nginx对客户端返回502...原创 2018-09-14 11:12:28 · 4895 阅读 · 0 评论 -
Nodejs http "The header content contains invalid characters ClientRequest.OutgoingMessage.setHeader"
当http请求header里的任意字段包含中文或其它非法字符都会报如下错误。对于header非法字符的判定方法,从Nodejs的4.x开始一直在改进,直到9.x才稳定下来。_http_outgoing.js:363 throw new TypeError('The header content contains invalid characters'); ^Typ...原创 2019-08-07 15:57:05 · 1378 阅读 · 0 评论 -
nodejs http request "INVALID_CONSTANT" error
问题描述:nodejs(4.x) httprequest 请求HTTP服务时,触发error事件,error.code是"INVALID_CONSTANT",并且收不到data事件。经问题排查和验证,发现当正文有内容但Content-Length没有设或者值不对,同时没有Transfer-Encoding: chunked就会导致INVALID_CONSTANT错误。解决方法:服务端采用非c...原创 2019-08-22 17:13:07 · 685 阅读 · 0 评论 -
Nodejs http request 报错 “ETIMEDOUT“,“ECONNRESET“ , “ENOTFOUND“,“ECONNREFUSED”,“EHOSTUNREACH“
"ETIMEDOUT"当客户端请求未设超时,同时服务端也没设超时或者超时大于Linux kernel默认的20-second TCP socket connect timeout情况下,则达到20秒没连接成功,则报出"ETIMEDOUT"错误,形如{"code":"ETIMEDOUT","errno":"ETIMEDOUT","syscall":"connect","address":"...原创 2019-09-03 14:35:26 · 63696 阅读 · 2 评论 -
redis存储中文UTF-8编码
set "24000" "{\"vid\":24000,\"duration\":98,\"category\":[\"生活百科\"],\"channel\":[\"生活百科\"],\"vchannel\":[\"1029\"],\"title\":\"上班族经常趴桌子上午睡后果很严重!危害身体健康,得不偿失\"}"其中value是utf-8方式编码则从redis读出来的是utf-8编...原创 2019-09-25 14:10:16 · 5685 阅读 · 0 评论 -
Mongodb Nodejs Client 3.0.8 “server instance pool was destroyed” error
Mongo的Nodejs客户端报出来的错,是Pool实例已经将自身destroy()掉之后再进行写操作的结果,Pool实例destroy()自身的具体原因有两种:1)30秒内连续重连30次都失败2)重新认证时,认证失败问题重现方法:Mongo服务端以单实例的形式启动,把包含了mongo客户端的web服务启动起来,然后kill -9 mongod进程,等待超过30秒,然后再通过web服务...原创 2018-08-15 10:39:08 · 5479 阅读 · 0 评论