Я делаю запрос к базе данных оракула, но есть много строк результатов, поэтому я получаю ошибку Недостаточно памяти для JavaScript-кучи.
Есть ли способ обработать результат запроса пакетно или что-то еще, чтобы не получить эту ошибку нехватки памяти?
Вы не указали, но я предполагаю, что вы используете node-oracledb. Если это так, то хитрость заключается в использовании объекта ResultSet. Это обеспечит согласованное чтение данных (одновременное представление данных с момента запуска запроса), позволяя при этом передавать данные по сети: https://oracle.github.io/node-oracledb/doc/api.html#streamingresults
Вот пример, в котором используется экземпляр QueryStream. Класс QueryStream — это всего лишь оболочка для ResultSet для предоставления потоковых API.
var oracledb = require('oracledb');
var dbConfig = require('./dbconfig.js');
var rowcount = 0;
oracledb.getConnection(
{
user : dbConfig.user,
password : dbConfig.password,
connectString : dbConfig.connectString
},
function(err, connection) {
if (err) {
console.error(err.message);
return;
}
var stream = connection.queryStream(
'SELECT first_name, last_name FROM employees ORDER BY employee_id',
[], // no binds
{ fetchArraySize: 150 } // internal buffer size for performance tuning
);
stream.on('error', function (error) {
// console.info("stream 'error' event");
console.error(error);
return;
});
stream.on('metadata', function (metadata) {
// console.info("stream 'metadata' event");
console.info(metadata);
});
stream.on('data', function (data) {
// console.info("stream 'data' event");
console.info(data);
rowcount++;
});
stream.on('end', function (metadata) {
// console.info("stream 'end' event");
stream.destroy(); // the stream should be closed when it has been finished
});
stream.on('close', function () {
// console.info("stream 'close' event");
console.info('Rows selected: ' + rowcount);
connection.close( // Note: do not close connections on 'end'
function(err) {
if (err) {
console.error(err.message);
}
});
});
});
Вы, вероятно, собираетесь передавать результаты в файл или объект ответа HTTP. В любом случае вам, скорее всего, понадобится правильный JSON, а не отдельные строки, которые возвращает драйвер. Взгляните на этот вопрос для примера того, как вы можете это сделать: https://github.com/oracle/node-oracledb/issues/908#issuecomment-390006986
Вы также можете использовать ResultSet с getRow() или getRows(), если вы не хотите использовать Stream. Проверьте Примеры — посмотрите на resultset1.js и resultset2.js.