Возможно ли module.exports локальную переменную из асинхронной функции? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть эта асинхронная функция в файле index.main.js, в котором есть переменная targetFiles, которую я хотел бы экспортировать в другой файл, index.js. Проблема в том, что я не могу найти способ экспортировать значение этой конкретной переменной, не получив в результате "undefined".

Я пытался реализовать функцию обещания, обратного вызова, экспортировать функцию по умолчанию и проводить бесчисленные часы исследований безрезультатно.

 //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 либо пусто, либо "undefined"

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

Ожидаемое значение, которое должно быть выходным, является значением targetFiles. Скажем, если targetFiles в асинхронной функции - abc12345.JSON, console.log в index.js должен иметь это значение.

Я надеюсь, что кто-нибудь может дать мне некоторое представление о том, как я могу преодолеть эту проблему. Заранее спасибо:)

1 Ответ

0 голосов
/ 05 июля 2019

Следующее решение может помочь вам, но не обязательно для вашего варианта использования.(Не используется module-exports):

Вы можете использовать request-context пакет для достижения той же функциональности.

Что делает пакет, вы можете установить 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 вы должны устанавливать его перед чтением.

Пожалуйста, дайте мне знать, если вышеприведенное решение не подходитдля вас.

...