初尝Nodejs,问一个无下限的问题(问题已经解决,但有后续疑问。。。)Nodejs

初尝Nodejs,问一个无下限的问题(问题已经解决,但有后续疑问。。。)Nodejs

在读node.js开发指南,说到package,书中举例package.json可以这么写:{ “main” : ‘./lib/subIndex.js’}。 但是,我运行的时候提示错误,一直找不到原因。。。提示如下: module.js:117 throw e; … Unexpected taken 锘?

类似于这样,求大神帮破。

文件编码问题,是用utf-8无bom或者ansi格式就正常运行了。如果utf-8带bom,便会报错。

试着去读了几行源码,看到module.js里面这么读取package.json文件: var jsonPath = path.resolve(requestPath, ‘package.json’); var json = fs.readFileSync(jsonPath, ‘utf8’); 然后,buffer中有utf-8和uft8两个参数处理方案,似乎如果传入参数’utf-8’会被转为’utf8’。 那么,node就不会读取带bom的utf-8文件吗?


16 回复

初尝Nodejs,问一个无下限的问题(问题已经解决,但有后续疑问。。。)

在阅读《Node.js开发指南》时,遇到了关于package.json配置的一些问题。书中提到可以将package.json配置如下:

{
    "main": "./lib/subIndex.js"
}

然而,在实际运行时遇到了错误。错误信息如下:

module.js:117
throw e;
...
Unexpected token 锘?

经过一番排查,发现原因是文件编码问题。使用UTF-8无BOM或ANSI编码时可以正常运行,但如果使用UTF-8带BOM编码,则会报错。

文件编码问题

在Node.js中,文件编码对程序的正确运行非常重要。UTF-8带BOM(Byte Order Mark)的文件在某些情况下会导致解析错误。这是因为BOM字符在文件开头被当作非标准字符被解析,从而导致JSON解析失败。

Node.js中的文件读取

Node.js在读取package.json文件时,使用了以下方式来读取文件内容:

var jsonPath = path.resolve(requestPath, 'package.json');
var json = fs.readFileSync(jsonPath, 'utf8');

这里的关键点在于fs.readFileSync方法的第二个参数。如果传递的是'utf-8',Node.js会自动将其转换为'utf8'。因此,如果文件是UTF-8带BOM编码,Node.js在解析时可能会出现问题,因为它不会自动跳过BOM。

示例代码

假设我们有一个简单的项目结构如下:

myproject/
├── lib/
│   └── subIndex.js
└── package.json

subIndex.js文件内容如下:

console.log('Hello from subIndex.js');

package.json文件内容如下(注意编码必须是UTF-8无BOM):

{
    "name": "myproject",
    "version": "1.0.0",
    "description": "A simple Node.js project",
    "main": "./lib/subIndex.js"
}

运行项目时,确保你的编辑器保存文件时使用的是UTF-8无BOM编码。你可以使用以下命令运行项目:

node .

结论

Node.js在读取文件时,默认处理的是UTF-8编码。如果文件包含BOM,可能会导致解析错误。因此,确保所有相关的JSON文件(如package.json)使用UTF-8无BOM编码是非常重要的。


单引号改成双引号就对了, 因为 JSON 就这么定义的… 认为无下限记得问题解决了标题上编辑下价格 [Closed] 哦 :)

好像不是唉,我改了还是提示同样的错误。。。而且,我记得,json要求key需要带着双引号,value没有这个限制。

怎么会没有…你上 json.org 看一下标准是怎么定义的… …不过,有些解释器支持而已…如果用 “” 你这里 / 可能需要用 //

会不会你的单引号或双引号是全角(中文)的单引号或双引号?

是的,你说得对,应该用双引号。重新看了一下标准,value在字符串的时候要求双引号,其它值是不能加双引号。比如,如果{“abc”:“true”}和{“abc”:true}都是正确的,但是格式化出来是不一样的对象。但是,我这个的问题还是没有解决。。。

谢谢你,我检查了,不是全角,是英文的。

贴一下完整的 package.json 和操作步骤吧, 可能漏了什么步骤

我直接去复制了node官网的package.json的例子,{ “name” : “some-library”,“main” : “./lib/some-library.js” },然后按照名字和路径改了lib下的js,还是报同样的错误。。。

啊…我知道这个问题了…你这个文件是用windows 记事本创建或者修改过的吧…?

补充一下,在windows 下 utf 8 如果用记事本修改…的话…会导致文件出现你所说的情况,然后很多时候不可用…例如gradle 也有这个问题…所以,我现在都不敢用记事本修改utf8文件…

你这个问题…可以向node 提一个issue …以前fastjson 也有一样的问题…

手写package.json文件多麻烦,用npm init让程序帮你生成吧

应该就是文件前面的bom影响了文件的读取。。。

根据你的描述,问题出在 package.json 文件的编码格式上。Node.js 在读取文件时,如果文件使用的是 UTF-8 带 BOM 编码,会导致解析错误。

示例代码

假设你的项目结构如下:

myproject/
├── lib/
│   └── subIndex.js
├── package.json
└── index.js

package.json

{
    "name": "myproject",
    "version": "1.0.0",
    "description": "A sample Node.js project",
    "main": "./lib/subIndex.js"
}

解释

  1. 文件编码:确保 package.json 使用 UTF-8 无 BOM 编码。
  2. Node.js 源码解读:Node.js 在读取文件时,默认使用 UTF-8 编码。如果文件包含 BOM(字节顺序标记),Node.js 可能会解析失败,因为它期望文件从第一个字符开始就是有效的 JSON。

示例操作步骤

  1. 检查并修改文件编码

    • 使用文本编辑器(如 VSCode、Notepad++ 等)打开 package.json
    • 将文件编码保存为 UTF-8 无 BOM。
  2. 验证文件内容

    • 打开命令行工具,进入项目目录。
    • 运行 node index.js,确保没有报错。

代码示例

假设 index.js 文件如下:

const path = require('path');
const pkg = require('./package.json');

console.log(`Main file is ${pkg.main}`);

确保 package.json 文件正确编码后,运行 node index.js 应该不会报错,并且输出 Main file is ./lib/subIndex.js

总结

Node.js 默认使用 UTF-8 编码读取文件,如果文件包含 BOM,则可能导致解析失败。确保 package.json 使用 UTF-8 无 BOM 编码即可解决问题。

回到顶部