标签: NodeJS

  • JavaScript 浮点数计算问题

    JavaScript 浮点数神坑当属 0.1 + 0.2 == 0.3false

    > 0.1 + 0.2 == 0.3
    false
    > 0.1 + 0.2
    0.30000000000000004
    >
    

    还有一些比较隐蔽的问题,比如 Math.roundNumber.prototype.toFixed 也都不是能完全正常工作的。

    > Math.round(1.105 * 100)
    111
    > Math.round(1.015 * 100)
    101
    > Math.round(1.025 * 100)
    102
    > 0.25.toFixed(1)
    '0.3'
    > 0.35.toFixed(1)
    '0.3'
    

    Math.round、toFixed 计算出错主要因为浮点数不能精确表示。

    在这里 0.35 和 1.015 的值都不准确,一个办法是转换成整数计算再除以对应的十百千;另一个办法是采用现有的 lib,比如 accounting

    > 1.015 * 100
    101.49999999999999
    

    代码运行环境

    D:\node -v
    v8.1.0
    
  • 如何修改 npm-debug.log 路径,无解

    目前没有找到修改 npm-debug.log 路径的方法,除非修改源码。

    npm 版本是 3.3.12

    这是 2014 年 stackoverflow 上的提问 Change npm-debug.log location,以及在 github 上讨论的 issue
    Put npm-debug.log file in the cache folder, not cwd #6744
    npm-debug.log could be written to /tmp or similar #1548
    以及假想解决方案
    Make npm-debug.log path configurable. #5252
    将 log 文件写入 app 目录的风险显而易见,尤其正式环境一般都不会开放 app 目录写权限。

    在源文件 npm/lib/util/error-handler.js 中 writeLogFile() 内部已经 hardcode writeStream(‘npm-debug.log’),当初是如何构思的?

    紧接着想到是否可以禁用 node-debug.log, 不过这并不是一个很好的解决方案.

     

    npm 命令行参考 官方 Shorthands and Other CLI Niceties

     

  • npm –prefix 指定目录

    最新上线一个 nodejs 项目,使用 pm2 做进程管理器。

    因为 pm2 更适合用作正式环境进程管理,不像开发环境使用 nodemon 实时监听文件改动重启 node 进程,所以每次发布之后需要执行 pm2 reload all 零延时载入代码。

    pm2 reload all 被配置到 package.json 的 scripts,执行命令 npm run pm2_reload 即可载入代码。

    现在的问题是 node 项目部署在 /www/ran-api,每次需要执行 cd /www/ran-api 进入该目录,才能执行 npm 命令,否则就会提示找不到 package.json 文件。

    后来终于在 npm 官方文档 https://docs.npmjs.com/misc/config 找到 –prefix 配置,也可以直接查看 npm 自带的 Markdown 教程,一般位于 /nodejs 安装目录/node_modules/npm/doc/misc/npm-config.md

    执行下述命令就不用再进入指定目录了:

    /nodejs/npm –prefix=/www/ran-api run pm2_reload

    其他命令也可以设置 –prefix,比如 npm config list

    [~]$ /nodejs/bin/npm config list –prefix=/www/ran-api
    ; cli configs
    ; 这是增加的命令行参数 prefix,会被设置到 npm.localPrefix
    prefix = “/www/ran-api”
    user-agent = “npm/3.3.12 node/v5.5.0 linux x64”

    ; node bin location = /nodejs/bin/node
    ; cwd = /home/ran
    ; HOME = /home/ran
    ; “npm config ls -l” to show all defaults.