Переменная не установлена ​​в функции nodejs - PullRequest
0 голосов
/ 09 января 2019

Я хочу присвоить данные 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 Ответ

0 голосов
/ 09 января 2019

На самом деле переменная 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#Asynchronous_JavaScript

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

https://medium.com/codebuddies/getting-to-know-asynchronous-javascript-callbacks-promises-and-async-await-17e0673281ee

https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261

...