Я использую модуль "pdf-text" для Node.js для преобразования PDF в массив строк, а затем извлекать из него определенные элементы. Но проблема в том, что я могу получить доступ к данным "куски", только когда я нахожусь в обратном вызове. Я хочу сохранить его в некоторой глобальной переменной, чтобы я мог использовать его в разных файлах. Я попытался хранить элементы массива внутри переменных, находясь внутри функции, но не повезло. Здесь код:
var pdfText = require('pdf-text');
var pathToPdf = "PDF FILE NAME";
var fs = require('fs');
var buffer = fs.readFileSync(pathToPdf);
var output;
pdfText(buffer, function(err, chunks){
if (err){
console.dir(err);
return;
}
console.dir(chunks);
output = chunks;
}
console.dir(output);
PS Я новичок в Node.js и JavaScript, и помощь будет очень признательна.
Заранее спасибо!
Выходная переменная будет установлена только с содержимым "кусков" при вызове обратного вызова.
Btw, вам нужно добавить ");" после объявления функции обратного вызова при вызове функции pdfText.
var pdfText = require('pdf-text');
var pathToPdf = "PDF FILE NAME";
var fs = require('fs');
var buffer = fs.readFileSync(pathToPdf);
var output;
pdfText(buffer, function(err, chunks){
if (err){
console.log(err);
return;
}
otherFunction(); // undefined
output = chunks;
otherFunction(); // chunks content
});
function otherFunction() {
console.log(output);
}
console.log(output); // undefined
О js-обратных вызовах: https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm
Но проблема в том, что я могу получить доступ к данным "куски", только когда я нахожусь в обратном вызове.
Да, это правильно. Вы не можете получить доступ к данным до их доступности, и когда они станут доступными, ваш обратный вызов будет вызван с данными.
Я хочу сохранить его в некоторой глобальной переменной, чтобы я мог использовать его в разных файлах.
Предположим, вы это сделали. Теперь у вас есть проблема. Ваш код в этих разных файлах: как он будет знать, когда данные будут готовы? Это не так.
Вам нужно каким-то образом сообщить этому коду, что данные готовы. Способ, которым вы указываете этот код, - это вызвать функцию. И в этот момент вам не нужны глобальные переменные: когда вы вызываете функцию в этом другом файле, вы передаете ей данные как параметр функции.
Другими словами, не просто иметь глобальный код в каком-то файле, который рассчитывает использовать данные ваших chunks
, ссылаясь на глобальную переменную. Вместо этого напишите функцию, которую вы можете вызвать из своего обратного вызова, и передайте chunks
в эту функцию.
chunks
может быть прямо внутри исходной функции обратного вызова. Или вы можете разбить любую часть этого кода на отдельную функцию, которая может вызвать это. И этот фрагмент кода может вызывать еще одну функцию, возможно, для некоторой повторяющейся задачи. Но во всех случаях код должен находиться в функции, которая вызывается прямо или косвенно из обратного вызова.
Если вы используете узел 8, я считаю, что вы можете использовать функцию async-ожидания. Таким образом, вы можете реорганизовать свой код так, чтобы он выглядел следующим образом:
var pdfText = require('pdf-text');
var pathToPdf = "PDF FILE NAME";
var fs = require('fs');
var buffer = fs.readFileSync(pathToPdf);
var output;
async function getPDF(buffer) {
pdfText(buffer, function(err, chunks){
if (err){
console.dir(err);
return;
}
return await chunks;
}
}
// you can get the chunks given the buffer here!
console.dir(getPDF(buffer));
Я хочу сохранить его в некоторой глобальной переменной, чтобы я мог использовать его в разных файлах. Я попытался хранить элементы массива внутри переменных, находясь внутри функции, но не повезло.
Я не думаю, что вы можете хранить куски как глобальную переменную, хотя вам придется export
кусок (например, module.exports = getPDF(buffer);
), который является синхронным, а функция getPDF является асинхронной. Поэтому вы должны использовать его в том же файле. Я бы сделал это, вместо этого импортирует функцию, а затем передаст ей другой буфер в разных js файлах, где требуется другой PDF файл. Надеюсь это поможет.