使用Node我正在尝试从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));
});
});
答案 0 :(得分:4)
正如@freakish所说,问题是我的数据太大了。
数据如此之大的原因是由于大量图像作为对象返回。最后,我需要做的是使用Buffers将对象编码为base64,然后数据的大小变得更易于管理。
答案 1 :(得分:1)
递归地发生了一些事情。
确保您的对象data
不包含任何循环引用,例如this
或其他任何难以序列化的引用。
答案 2 :(得分:0)
Stephen的数据不是“太大”。这是Node中的一个错误,已跟踪here,但尚未完全修复。两年后,我仍然看到它,有时对象的复杂性有时会产生OOM错误,但大多数时候都成功地写入了磁盘。
一种解决方法是研究使用流式JSON编写器库,例如json-write(来自D3作者Mike Bostock)。