是否有可能module.exports从异步函数的局部变量?

时间:2019-07-05 01:46:08

标签: node.js node-modules async.js

我在名为index.main.js的文件中具有此异步功能,该文件具有变量'targetFiles',我想将其导出到另一个文件index.js。问题是我找不到一种方法来导出此特定变量的值,而不会导致结果为“ undefined”。

我尝试实现promise,回调,导出默认功能,并进行了无数小时的研究,但无济于事。

 //this code is in index.main.js

  var targetFiles = "";

  async function listFilesInDepth()

    {

      const {Storage} = require('@google-cloud/storage');

      const storage = new Storage();

      const bucketName = 'probizmy';

      const [files] = await storage.bucket(bucketName).getFiles();

      console.log('List Of Files Available:'); 



        files.forEach(file =>

          {

            targetFiles = file.name;  //this is the variable to export

            console.log(`-----`+file.name);

          });

         return targetFiles;

    }


  module.exports = {
   fn : targetFiles
  }

尝试将值导出到index.js为空或“未定义”

   //this is the code in index.js
   const a = require('./index.main');
   console.log(a.fn); //undefined or empty

应该作为输出的期望值是targetFiles的值。假设如果async函数中的targetFiles是abc12345.JSON,则index.js中的console.log应该具有该值。

我希望有人能给我一些有关如何克服这个问题的见解。预先谢谢你:)

1 个答案:

答案 0 :(得分:0)

以下解决方案可能会对您有所帮助,但不确定您的用例。 (不使用module-exports):

您可以使用request-context package来实现相同的功能。

包的作用是,您可以针对value(data)设置key,然后在同一context内的以下代码执行中访问相同的内容。

运行npm install request-context

在主app.js(服务器文件)中,将request-context注册为中间件。

const contextService = require("request-context");
const app = express();
...
// Multiple contexts are supported, but below we are setting for per request.
app.use(contextService.middleware("request"));
...

然后在您的index.main.js中,一旦targetFiles准备就绪,请将targetFiles设置为请求上下文。

const contextService = require("request-context");

...
files.forEach(file =>

      {

        targetFiles = file.name;  //this is the variable to export

        console.log(`-----`+file.name);

      });
     // Here `Request` is the namespace(context), targetFileKey is the key and targetFiles is the value.
     contextService.set("request:targetFileKey", targetFiles);
     return targetFiles;

}
...

在同一请求中,您想使用targetFile时,可以执行以下操作:

index.js(可以是设置后需要targetFiles的任何文件):

const contextService = require("request-context");

...
// Reading from same namespace request to which we had set earlier
const targetFiles = contextService.get("request:targetFileKey");
...

请注意: 您将能够以与您设置的相同的targetFiles访问request。也就是说,我们在request-context中配置的app.js是针对每个API请求的,这意味着,在每个API请求中,您都必须在读取之前进行设置。

如果上述解决方案不适合您,请告诉我。