在Node.js的透过JSON.stringify会导致“加工出来的内存”错误(In Node.js

2019-07-30 02:49发布

随着节点我想从LDAP服务器收集用户数据,然后将数据写入到一个JSON文件。 我使用下面的代码来做到这一点:

fs.writeFile('data.json', JSON.stringify(data, null, 4));

问题是JSON.stringify方法引起以下错误:

FATAL ERROR: JS Allocation failed - process out of memory

我知道这个问题是与JSON.stringify因为如果我使用console.log而不是fs.writeFile我得到同样的错误。

我试图写大量的数据(在LDAP数据库中超过500项)。 有谁知道我能得到这个工作? 这是在充分的代码:

var ldap = require('ldapjs');
var util = require('util');
var fs = require('fs');
var client = ldap.createClient({
  url: '************'
});

client.bind('CN=**********,OU=Users,OU=LBi UK,OU=UK,DC=********,DC=local', '*********', function(err) {
  if (err) {
    console.log(err.name);
  }
});


// taken from http://ldapjs.org/client.html
client.search('OU=Users,OU=******,OU=UK,DC=******,DC=local', {
  scope: 'sub',
  filter: 'objectClass=organizationalPerson',
  attributes: ['givenName', 'dn', 'sn', 'title', 'department', 'thumbnailPhoto', 'manager']
  // filter by organizational person
}, function(err, res) {
  if (err) {
    console.log(err.name);
  }

  var limit = 1;
  var data = {"directory": []};

  res.on('searchEntry', function(entry) {

    var obj = {};
    entry.attributes.forEach(function (attribute) {
      var value;
      if (attribute.type === 'thumbnailPhoto') {
        value = attribute.buffers[0];

      } else {
        value = attribute.vals[0];
      }
      obj[attribute.type] = value;
    });
    data.directory.push(obj);
  });
  res.on('error', function(err) {
    console.log('error: ' + err.message);
  });
  res.on('end', function(result) {
    fs.writeFile('data.json', JSON.stringify(data, null, 4));
  });

});

Answer 1:

作为@freakish提到的问题是我的数据是太大了。

该数据是如此之大的原因是由于大量的,正在返回的对象的图像。 在结束所有我需要做的是编码对象为使用缓冲的base64,然后将数据的大小变得更易于管理。



Answer 2:

什么是递归发生。

请确保你的对象data中不包含任何循环引用,如this或其他任何有困难被序列化。



文章来源: In Node.js using JSON.stringify results in 'process out of memory' error