Node.js 如果脚本文件未直接运行,Nodejs必需变量未定义?

Node.js 如果脚本文件未直接运行,Nodejs必需变量未定义?,node.js,parallel-processing,require,Node.js,Parallel Processing,Require,我对问题的措辞表示歉意-作为一个问题总结起来有点困难-如果你能澄清,请随意编辑。此外,由于这是一个相当复杂和漫长的问题-感谢所有花时间阅读它的人 我有4个文件(从项目根目录树中列出),作为我正在构建的项目的一部分,该项目旨在刮除区块链并利用多个核心完成工作: /main.js ./scraper.js /api/api.js /api/litecoin_api.js main.js const { scraper } = require('./scraper.js') const blockch

我对问题的措辞表示歉意-作为一个问题总结起来有点困难-如果你能澄清,请随意编辑。此外,由于这是一个相当复杂和漫长的问题-感谢所有花时间阅读它的人

我有4个文件(从项目根目录树中列出),作为我正在构建的项目的一部分,该项目旨在刮除区块链并利用多个核心完成工作:

  • /main.js
  • ./scraper.js
  • /api/api.js
  • /api/litecoin_api.js
  • main.js

    const { scraper } = require('./scraper.js')
    const blockchainCli = process.env.BLOCKSCRAPECLI || 'litecoin-cli'
    
    const client = (args) => {
      // create child process which returns a promise which resolves after
      // data has finished buffering from locally hosted node using cli
      let child = spawn(`${blockchainCli} ${args.join(' ')}`, {
        shell: true
      })
      // ... wrap command in a promise here, etc
    }
    
    const main = () => {
      // count cores, spawn a worker per core using node cluster, add
      // message handlers, then begin scraping blockchain with each core...
      scraper(blockHeight)
    }
    
    main()
    
    module.exports = {
      client,
      blockchainCli
    }
    
    scraper.js

    const api = require('./api/api.js')
    const scraper = async (blockHeight) => {
      try {
        let blockHash = await api.getBlockHashByHeight(blockHeight)
        let block = await api.getBlock(blockHash)
        // ... etc, scraper tested and working, writes to shared writeStream
    }
    
    module.exports = {
      scraper
    }
    
    api.js

    const { client, blockchainCli } = require('../main.js')
    const litecoin = require('./litecoin_api')
    
    let blockchain = undefined
    
    if (blockchainCli === 'litecoin-cli' || blockchainCli === 'bitcoin-cli') {
      blockchain = litecoin
    }
    // PROBLEM HERE: blockchainCli (and client) are both undefined if and
    // only if running scraper from main.js (but not if running scraper
    // from scraper.js)
    
    const decodeRawTransaction = (txHash) => {
      return client([blockchain.decodeRawTransaction, txHash])
    }
    
    const getBlock = (blockhash) => {
      return client([blockchain.getBlock, blockhash])
    }
    
    const getBlockHashByHeight = (height) => {
      return client([blockchain.getBlockHash, height])
    }
    
    const getInfo = () => {
      return client([blockchain.getInfo])
    }
    
    const getRawTransaction = (txHash, verbose = true) => {
      return client([blockchain.getRawTransaction, txHash, verbose])
    }
    
    module.exports = {
      decodeRawTransaction,
      getBlock,
      getBlockHashByHeight,
      getInfo,
      getRawTransaction
    }
    
    所以,我去掉了文件中的大部分杂音,我认为这是不必要的,但它是开源的,所以如果你需要更多的

    问题是,如果我从
    scraper.js
    内部启动scraper,比如说:
    scraper(1234567)
    它就像一个符咒一样工作,并将预期的数据输出到csv文件

    但是,如果从
    main.js
    文件内部启动刮板,则会出现以下错误:

    Cannot read property 'getBlockHash' of undefined
        at Object.getBlockHashByHeight (/home/grayedfox/github/blockscrape/api/api.js:19:29)
        at scraper (/home/grayedfox/github/blockscrape/scraper.js:53:31)
        at Worker.messageHandler (/home/grayedfox/github/blockscrape/main.js:81:5)
    
    我不知道为什么,当从
    main.js
    启动scraper时,区块链是未定义的。我认为这可能是由于解构造成的,但是在示例
    main.js
    文件中删除第一行左右的大括号不会改变任何东西(相同的错误)

    目前情况有点混乱(在开发这个分支的过程中),但现在的基本问题是,我不清楚如果按以下方式使用require,为什么会失败(无法看到main.js中的变量):

    • main.js(执行scraper())>scraper.js>api.js
    但如果按如下方式运行,则不会失败(可以看到main.js中的变量):

    • scraper.js(执行scraper())>api.js

    非常感谢您抽出时间

    在main和api之间有一个循环依赖关系,每个依赖关系都需要另一个依赖关系。干管需要通过刮板的api,api直接需要干管。这导致事情不起作用


    您必须通过将公共共享代码放入其自己的模块中来移除循环依赖关系,该模块可以由两者包含,但不包括包含它的其他模块。它只需要更好的模块化。

    在main和api之间有一个循环依赖关系,每个依赖关系都需要另一个依赖关系。干管需要通过刮板的api,api直接需要干管。这导致事情不起作用。您必须通过将公共共享代码放入其自己的模块中来移除循环依赖关系,该模块可以由两者包含,但不包括包含它的其他模块。它只需要更好的模块化。哦,天哪。。。当然非常感谢。如果你想投票的话,你可以随便回答吗?否则,我将自己放入解决方案中(将客户机函数分离到它自己的模块中)。