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

Setting a Node.js Object to data read from a file

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

1
2
3
4
5
6
7
8
9
One: {title: 'One' ,
contributor: 'Fred',
summary: 'blah' ,
comments: 'words' },

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

我试着把它设置成这样一个空的物体:

1
2
3
4
5
var fs = require('fs');
var text = Object.create(null);
fs.readFile("./public/text.txt","utf-8", function(error, data) {
  text = { data };
});

但是,当我把text登录到控制台时,会出现如下情况:

1
2
3
4
5
6
7
8
9
10
11
{ data: 'One: {title: \'One\' ,
contributor: \'Fred\',
summary: \'blah\' ,
comments: \'words\' },
   
Two: {title: \'Two\' ,
contributor: \'Chris\' ,
summary: \'blah blah i\'m a blah\' ,
comments: \'\' },

'
}

显然,它把data作为一把钥匙。不过,我真正想要的是:

1
2
3
4
5
6
7
8
9
10
11
{
  One: {title: 'One' ,
  contributor: 'Fred',
  summary: 'blah' ,
  comments: 'words' },

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

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


如果您使用的是较新版本的节点,则支持ES6。

1
2
3
4
5
// So your code
`text = { data }`

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

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

1
2
3
4
5
var fs = require('fs');
var text = Object.create(null);
fs.readFile("./public/text.txt","utf-8", function(error, data) {
  text = JSON.parse(data);
});

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
 "One": {
   "title":"One" ,
   "contributor":"Fred",
   "summary":"blah" ,
   "comments":"words"
  },

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


您要做的是使用eval,这是您真正不想将文件编辑为有效的json或导出@spidy建议的对象时的唯一方法。只要确保文件是有效的javascript,因为您给出的示例

1
summary: 'blah blah i'm a blah'

但你需要像躲避江户记1(2)一样逃离江户记1(1)。

1
2
3
4
5
6
var fs = require('fs');
var text = {};
fs.readFile('./public/text.txt', 'utf-8', function (error, data) {
  eval(`text = {${data}}`);
//eval('text = {' + data + '}');
});

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