Node.js 弹坑记录

最近沉迷于Node.js无法自拔,它跟浏览器的js语法一致,有着高度自由和异步的特性,还有着可能是世界上最好的包管理器。

不得不说学习难度比PHP大不少,特开此文来记录学习过程中碰到的坑。


创建命令脚本

npm可以方便的发布命令行程序。只需要在项目的package.json加入 bin{"order":"script.js"},并且安装这个包。

但是问题来了,别人的包安装完之后编译出的脚本是这样的

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"   "%~dp0\node_modules\xxx\index.js" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node   "%~dp0\node_modules\xxx\index.js" %*
)

而我的包是这样的

"%~dp0\node_modules\xxx\index.js" %*

多方查阅,是因为我没有为脚本文件加入shebang,导致编译时没指定文件解释器。对于js文件,加入shebang #! /usr/bin/env node就OK了。

Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指明了执行这个脚本文件的解释程序。

  1. 如果脚本文件中没有#!这一行,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)。
  2. 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。
  3. 如果#!指定的解释程序没有可执行权限,则会报错“bad interpreter: Permission denied”。
    如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。
  4. 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。
    注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动到$PATH中寻找解释器的。
  5. 当然,如果你使用”bash test.sh”这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显式指定的bash。

NODE_PATH 环境变量

问题:Win环境下,全局安装的模块不能被require正确地找到。
解决:因为缺少 NODE_PATH 全局变量的定义。npm root -g 查看当前全局目录,然后将其值赋予NODE_PATH。

安装包失败

居然有可能是因为网络原因导致缓存异常,此时只需要npm cache clean --force

response分多次响应

在http服务中,我们通过response.write(内容)来向客户端发送数据。
假设服务器发送的数据是断断续续的或者数据量比较大,我们就需要分多次来发送,原理上只需要多次调用write函数,但是这里有几个小坑。

1.write会发送响应头,而响应头只应该被发送一次。
2.response需要在最后调用end来声明本次传输已经结束,不要让客户端等待。
3.一些浏览器可能会等待接收到N个字节后再显示出来,其中谷歌浏览器大约4KB,而IE浏览器居然有200多KB。所以测试阶段发现及时刷新无效,可能只是因为你的测试数据量太小了。