Переменная не установлена в функции nodejs
Я хочу назначить данные JSON переменной, проанализировав файл warc в функции. Переменная недоступна вне функции и возвращает пустой массив в консоли.
var metadataObj = {
metadata: []
};
fs
.createReadStream('mywarc-file.warc')
.pipe(new WARCStreamTransform())
.on('data', record => {
if (targetURL === record.warcHeader['WARC-Target-URI']){
if(record.warcHeader['WARC-Type'] === 'response'){
metadataObj.metadata.push({
Url: record.warcHeader['WARC-Target-URI'],
WarcID:record.warcHeader['WARC-Warcinfo-ID'],
Timestamp:record.warcHeader['WARC-Date'],
ContentType:record.warcHeader['Content-Type']
})
}else{
metadataObj.metadata.push({
Host: record.httpInfo.headers['Host'],
userAgent: record.httpInfo.headers['User-Agent']
})
}
}
})
console.log(metadataObj.metadata)
1 ответ
На самом деле, переменная metadataObj доступна и, возможно, установлена. Проблема в том, что оператор console.log выполняется до установки нового значения переменной.
Я бы порекомендовал вам прочитать больше об обработке асинхронного кода и области переменных в javascript.
Вот ваш код исправлен:
var metadataObj = {
metadata: []
};
fs
.createReadStream('mywarc-file.warc')
.pipe(new WARCStreamTransform())
.on('data', record => {
if (targetURL === record.warcHeader['WARC-Target-URI']){
if(record.warcHeader['WARC-Type'] === 'response'){
metadataObj.metadata.push({
Url: record.warcHeader['WARC-Target-URI'],
WarcID:record.warcHeader['WARC-Warcinfo-ID'],
Timestamp:record.warcHeader['WARC-Date'],
ContentType:record.warcHeader['Content-Type']
})
}else{
metadataObj.metadata.push({
Host: record.httpInfo.headers['Host'],
userAgent: record.httpInfo.headers['User-Agent']
})
}
}
})
.on('end', () => {
console.log(metadataObj.metadata)
})
Полезные источники для чтения:
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Asynchronous/Introducing
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261