News:
--harmnoy
process.on('uncaughtException', (err) => { console.error(err); });
uncaughtException
事件可以捕捉到那些已经被抛出到最顶层调用栈的异常,一旦添加了这个监听器,这些异常便不再会导致进程退出。实际上有一些比较激进的人士认为程序一旦出现事先没有预料到的错误,就应该立刻崩溃,以免造成进一步的不可控状态,也为了提起开发人员足够的重视。但我从比较务实的角度建议还是不要这样做,尤其是服务器端程序,一个进程崩溃重启可能需要一分钟左右的时间,这段时间会造成服务的处理能力下降,也会造成一部分连接没有被正确地处理完成,这个后果很可能是更加严重的。但我们应当将在这个事件中捕捉到的错误视作非常严重的错误,因为在此时已经丢失了和这个错误有关的全部上下文,必然无法妥善地处理这个错误,唯一能做的就是打印一条日志。
process.on('unhandledRejection', (reason, p) => { console.error(reason, p); });
unhandledRejection
事件可以捕捉到那些被 reject 但没有被添加 .catch 回调的 Promise, 通常是因为你忘记为一个返回 Promise 的函数添加 return。因为 Promise 本来就是对异步错误的一种封装,所以实际使用中偶尔也会出现 Promise 先被 reject, 而后再用 .catch 添加错误处理的情况,所以这个事件实际上偶尔会有误报。
//要得到一个then then then的promise链,先定义一个已经resolve了的promise,然后依次往后then… var sequence = Promise.resolve(); array.forEach(function(item) { sequence = sequence.then(...) });
multer
需要手动引入json:true/false
来修改prettyPrint
会把object或json展开成多行, 利于肉眼观察不利于grep分析sudo npm i http-server -g
安装, 之后使用http-server
命令来启动静态网站./home/you/.node-gyp/0.10.26/common.gypi not found
,原因可能是上一次失败引起,直接删除.node-gyp
整个文件夹迫使其重新编译即可。socket.remoteAddress
的 IP 显示格式就变成了 IPv6 格式, 比如IP 10.11.13.3
变为 ::ffff:10.11.13.3
/** 清屏 */ process.stdout.write('\x1b[2J'); /** 移动光标到左上角 */ process.stdout.write('\x1b[0f');
npm i
之后, 会留下大量冗余的文件与中间编译文件npm ddp
来对单项目下的重复包进行冗余去除It is 4 things: It creates a new object. The type of this object, is simply object. It sets this new object's internal, inaccessible, [[prototype]] property to be the constructor function's external, accessible, prototype object (every function object automatically has a prototype property). It executes the constructor function, using the newly created object whenever this is mentioned. It returns the newly created object, unless the constructor function returns a non-primitive value. In this case, that non-primitive value will be returned.
new 相当于
function New(func) { var res = {}; if (func.prototype !== null) { res.__proto__ = func.prototype; } var ret = func.apply(res, Array.prototype.slice.call(arguments, 1)); if ((typeof ret === "object" || typeof ret === "function") && ret !== null) { return ret; } return res; }
所以 var sth = new func()
时, func()返回值而不是引用时, sth是func对象的新对象, 如果返回值为引用, 则sth为该引用.
var name = 'some'; global[some] = 'thing'
, var name = 'some'; var name2={}; name2[name]='thing'
var obj = {name:'some',des:'thing'}; delete obj.des;
;删除对象则直接obj=null
会自动回收。var name = 'some' && 'thing'; //name == 'thing' var name = false || 'thing'; //name == 'thing' var name = false && 'thing'; //name == false
var old = {a: 1, b: 2}; var new = Object.assign({}, old);// 可能不适用IE
fs.createWriteStream
以 w+
的方式打开, 那么中途在另一进程里 truncate -s0 tt.log
之后, 文件流仍然会继续在之前的位置写入 tt.log , 导致 tt.log 大小仍保持原大小,第一行变成了原长度的乱码。 所以有定期 truncate 的文件在写入时一定要使用 a+
的方式来打开流。 详见 man fopen
. 所以使用 forever-monitor 这个库时一定记得加上参数 append:true
, 具体见库源码.console.log('9.99' > '10.00'); // true, => '9' > '1' console.log('9.99' > 10.00); // false, => 9.99 < 10.00 console.log('wtf9.99' > 10.00);// false, => 9.99 < 10.00
console.log()