是否可以 module.exports 从异步函数中导出局部变量?

Posted

技术标签:

【中文标题】是否可以 module.exports 从异步函数中导出局部变量?【英文标题】:Is it possible to module.exports a local variable from async function? 【发布时间】:2019-11-15 15:33:44 【问题描述】:

我在一个名为 index.main.js 的文件中有这个异步函数,它有一个变量“targetFiles”,我想将它导出到另一个文件 index.js。问题是我无法找到一种方法来导出这个特定变量的值而不会导致“未定义”。

我尝试过实现 promise、callback、导出默认函数,做了无数小时的研究无济于事。

 //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 的值。假设如果异步函数中的targetFiles是abc12345.JSON,那么index.js中的console.log应该是那个值。

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

【问题讨论】:

你在哪里调用函数? 我没听懂你的意思?这实际上是函数的一个片段,我只是简化了它,因为我主要关心的是从 index.main.js 导出 targetFiles 的值到 index.js。 之所以为空是因为你需要运行listFilesInDepth()函数来设置targetFiles的值。 谢谢。我已经完成了,当我使用 return console.log("The value of targetFiles is "+(newtf)); 时,我可以使用带参数的新函数获取值。但是,当我在函数中使用 return newtf 并使用 console.log(fn.listFilesInDepth()) 我得到 Promise 为什么会这样? Pending 表示它目前正在处理中,您必须等待 Promise 的返回才能实现值。 【参考方案1】:

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

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

包的作用是,您可以针对key 设置value(data),然后在同一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");
...

请注意: 您将能够在您设置的request 中访问targetFiles。也就是说,我们在app.js中配置的request-context是针对每个API请求的,也就是说,在每个API请求中,你必须在读取之前设置它。

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

【讨论】:

感谢您的回答。很抱歉回复晚了,因为我一直在尝试实施您的解决方案,但我没有 app.js 文件,所以我创建了一个并使用了您的代码,但是我从节点 index.js 获得的值对于 targetFiles 返回未定义。我做错了什么? 不需要index.js 文件来读取值。假设request到达controller(index.main.js),我们将targetFiles设置为requestContext,那么在同一个请求中,我们可以在代码中的任何地方访问targetFiles,即假设控制从controller流向service文件,在service文件中,可以从requestContext得到targetFiles 用注释和一些解释更新了答案。如果您仍然遇到问题,请告诉我。如果需要,我可以通过 github 分享代码示例 我正在使用 index.js,因为该文件保存了我将系统置于其上的 pdf 的 url。 targetFile 是声明pdf文件的名称。 index.main.js 用于 npm,因此 index.js 是必要的。我尝试了 requestContext 方法,但是由于某种原因返回值是未定义的 请检查以下 repo。已创建示例代码:git@gitlab.com:sagarch888/demouserapp.git

以上是关于是否可以 module.exports 从异步函数中导出局部变量?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 module.exports 内的 promise 函数中返回解析

在 ES6 中使用 module.exports 导出多个函数

Nodejs/Express/Typescript 需要 module.exports

module.exports 与 exports

编写 module.exports 函数有啥区别? [复制]

node.js 中 module.exports= 函数的含义