【发布时间】:2019-07-01 19:25:04
【问题描述】:
我有这个代码:
app.post('/pst', function(req, res) {
var url = req.body.convo;
myAsyncFucntion(url).then(result => {
console.log('TAKE A LOOK AT THIS!');
//transforming array to string to pass to Buffer.from()
//then we remove ',' with newlines, so each index of array is a new line
var str = result.toString();
result = str.split(',').join('\r\n');
//clever way to send text file to client from the memory of the server
var fileContents = Buffer.from(result, 'ascii');
var readStream = new stream.PassThrough();
readStream.end(fileContents);
res.set('Content-disposition', 'attachment; filename=' + fileName);
res.set('Content-Type', 'text/plain');
readStream.pipe(res);
//garbage collecting. i don't know if it's neccessary
result = '';
str = '';
}).catch(err => {
console.log(err);
res.render('error.ejs');
})
});
此代码将运行一个异步函数,并以文本文件的形式从内存中为用户提供一些数据。 我计划使用套接字并通知客户工作已完成。 客户端将输入一个链接并下载一个文件。
所以我计划获取局部变量结果并将其导出到全局变量中。
这样,app.get() 将可以访问它,当用户点击该链接时,它将提供该文件。
但一位用户告诉我,全局变量是在实例之间共享的。
这是真的吗?所以如果两个(或更多)用户试图同时得到他们的结果,全局变量将是相同的
他们两个?
【问题讨论】:
-
“实例”是什么意思?
-
我认为他的意思是节点服务的运行实例。但是,接下来的问题是:不同的用户可能会访问一个用户私有的数据(?)
-
例如,两个用户访问网络应用,将是两个实例。
-
@user1584421 是的,只有一个运行时可以同时处理两个请求,并且它们将共享一个全局变量。您需要为不同的用户创建不同的资源 - 例如存储在全局
Map中 -
@user1584421 请注意,如果每个请求都有自己的全局变量,那么您的方法将无法正常工作 -
/pst调用会创建一个值,但随后会单独请求从链接下载文件如果它再次拥有自己的全局变量,则无法访问它。所以是的,您需要明确区分不同用户的(可能是并发的)请求。
标签: javascript node.js asynchronous async-await global-variables