将 Node.js 对象设置为从文件读取的数据

Posted

技术标签:

【中文标题】将 Node.js 对象设置为从文件读取的数据【英文标题】:Setting a Node.js Object to data read from a file 【发布时间】:2016-06-28 03:41:05 【问题描述】:

我想从文件中读取数据并将其添加到存储在内存中的对象中。文件 text.txt 中的数据大致如下:

One: title: 'One' ,
contributor: 'Fred',
summary: 'blah' ,
comments: 'words' ,

Two: title: 'Two' ,
contributor: 'Chris' ,
summary: 'blah blah i'm a blah' ,
comments: '' ,

我正在尝试将它设置为一个空对象,如下所示:

var fs = require('fs');
var text = Object.create(null);
fs.readFile("./public/text.txt", "utf-8", function(error, data) 
  text =  data ;
);

但是,当我将text 登录到控制台时,它看起来像这样:

 data: 'One: title: \'One\' ,\ncontributor: \'Fred\',\nsummary: \'blah\' ,\ncomments: \'words\' ,\n    \nTwo: title: \'Two\' ,\ncontributor: \'Chris\' ,\nsummary: \'blah blah i\'m a blah\' ,\ncomments: \'\' ,\n\n' 

显然,它正在读取data 作为键。不过,我真正想要的是更像这样的东西:


  One: title: 'One' ,
  contributor: 'Fred',
  summary: 'blah' ,
  comments: 'words' ,

  Two: title: 'Two' ,
  contributor: 'Chris' ,
  summary: 'blah blah i'm a blah' ,
  comments: '' ,

这里的任何建议将不胜感激。

【问题讨论】:

真正简单:只需使用JSON.parse(data);。查看副本:Using Node.JS, how do I read a JSON object into (server) memory? 我尝试了那个解决方案。当我这样做时,我得到Syntax Error: Unexpected token O 我突然想到,解决该语法错误的一种可能方法是将 text.txt 文件中的所有内容包含在一些 大括号内。这给我带来了一些困难;有什么办法可以避免吗? 问:Syntax Error: Unexpected token O。 A:那么你的Json文件是非法的。建议:确保您有... 分隔最外层的“数据”节点。您发布的问题的答案是“使用 JSON.parse()”。您的语法错误的答案是“修复您的 JSON 文件”。 【参考方案1】:

如果您使用的是较新版本的 Node,那么您将支持 ES6。

// So your code 
`text =  data ` 

// is actually a shortcut for 
`text =  data: data `

这就是为什么您最终会得到一个对象,该对象具有关键数据并且值是文件中所找到内容的字符串版本。相反,只需在数据参数(它是一个字符串)上使用 JSON.parse,它就会将其转换为一个对象,您可以将其存储在文本中。像这样

var fs = require('fs');
var text = Object.create(null);
fs.readFile("./public/text.txt", "utf-8", function(error, data) 
  text = JSON.parse(data);
);

您还需要使文件成为有效的 json。这意味着键和字符串值一样需要引号。


  "One": 
    "title": "One" ,
    "contributor": "Fred",
    "summary": "blah" ,
    "comments": "words"
  ,

  "Two": 
    "title": "Two" ,
    "contributor": "Chris" ,
    "summary": "blah blah i'm a blah" ,
    "comments": ""
  

【讨论】:

查看我对这个问题的评论。 抱歉,你用其他问题更新了我的答案 呃.... 哎呀,这可能是我能得到的最好的了。公平的解决方案。我将保持开放状态,看看是否有人提出一种方法来做到这一点而不用括号括起来。 您可以使用 require() 将其加载为 javascript 文件,但您需要添加一行用于导出 或者使用更好的扩展文件系统,如 fs-extra 或 node-jsonfile,但你会注意到他们只是为你做:github.com/jprichardson/node-jsonfile/blob/master/index.js#L14【参考方案2】:

您要做的是使用eval,如果您真的不想将文件编辑为有效的 JSON 或按照@Spidy 的建议导出对象,这是唯一的方法。只需确保该文件是有效的 JavaScript,因为您提供的示例有

summary: 'blah blah i'm a blah'

但你需要像i\'m一样转义i'm

var fs = require('fs');
var text = ;
fs.readFile('./public/text.txt', 'utf-8', function (error, data) 
  eval(`text = $data`);
//eval('text = ' + data + '');
);

但我不一定建议这样做,因为这允许执行任意 javascript。取决于文件中的数据如何到达那里,这将是一个巨大的安全风险。

【讨论】:

以上是关于将 Node.js 对象设置为从文件读取的数据的主要内容,如果未能解决你的问题,请参考以下文章

Node.Js 向文件写入和读取数组

node 怎么样将一个buffer写入文件

如何在 Node JS 中读取文本文件并将其作为 JSON 对象返回?

你怎么得到运行Node.js脚本的cron作业从.env文件中读取变量?

如何使用 HTML 输入文件导入 excel 文件并在 Node.js 中读取文件内容(如何将完整路径发送到 Node.js)

使用 Node.js 和 SSH2 从 SFTP 服务器读取文件