Con*_*erb 6 javascript node.js
我使用一个简单的Node.js从有效的jsonfile中提取信息(使用JSLint检查),但我使用的代码不返回预期的值:
squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json'));
Run Code Online (Sandbox Code Playgroud)
它返回:
{ type: 'Buffer',
Run Code Online (Sandbox Code Playgroud)
数据:[123,10,32,32,34,97,99,... 548更多项目]}
有什么理由为什么会这样?
Sid*_*ney 23
fs.readFileSync() 如果未指定编码,则返回Buffer.
https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options
那么,告诉fs.readFileSync()使用什么编码:
squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json', 'utf8'));
Run Code Online (Sandbox Code Playgroud)
Sidney回答了 “为什么”的问题,但最好使用“做什么” require(),它支持同步解析有效的JSON文件并将结果作为对象返回:
squadJSON = require('./squads/squad' + whichSquad + '.json');
Run Code Online (Sandbox Code Playgroud)
甚至更好,使用ES6 模板文字:
squadJSON = require(`./squads/squad${whichSquad}.json`);
Run Code Online (Sandbox Code Playgroud)
使用中的一个显着区别require()是,它从中解析相对路径__dirname,这是当前模块的目录路径,而fs方法使用中process.cwd(),或者是“当前工作目录”,它是程序主模块所在的目录,来解析相对路径。
希望下面的示例演示它们的相对路径分辨率如何不同:
使require(...)行为像JSON.parse(fs.readFileSync(..., 'utf8')):
const { resolve } = require('path');
function readFileSyncJson (path) {
return require(resolve(process.cwd(), path));
}
Run Code Online (Sandbox Code Playgroud)
并使JSON.parse(fs.readFileSync(..., 'utf8'))行为像require(...):
const { resolve } = require('path');
function requireJson (path) {
return JSON.parse(fs.readFileSync(resolve(__dirname, path), 'utf8'));
}
Run Code Online (Sandbox Code Playgroud)