是否可以 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以下解决方案可能会对您有所帮助,但不确定是否适合您的用例。 (不使用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