Javascript 在node.js中使用全局变量
我有一个简单的例子:Javascript 在node.js中使用全局变量,javascript,node.js,Javascript,Node.js,我有一个简单的例子: server = http.createServer(function(req, res) { uploads = {} if (req.url == '/check') { res.writeHead(200, {'content-type': 'text/plain'}); res.write(JSON.stringify(uploads)); res.end(); } if (req.u
server = http.createServer(function(req, res) {
uploads = {}
if (req.url == '/check') {
res.writeHead(200, {'content-type': 'text/plain'});
res.write(JSON.stringify(uploads));
res.end();
}
if (req.url == '/upload') {
var form = new formidable.IncomingForm();
form.on('fileBegin', function(field, file) {
var tracker = {file: file, progress: [], ended: false};
uploads[file.filename] = tracker;
file.on('progress', function(bytesReceived) {
tracker.progress.push(bytesReceived);
})
});
};
});
为什么“检查”返回空上传?在这种情况下我应该使用全局变量吗?
upload
在每个请求上都被设置为空对象({}
),它总是{}
请注意,该函数在所有请求上都被调用
全局变量在node.js中有特殊含义,因为所有模块都有一个局部作用域。
解决方案是在函数外部声明它
像这样
var uploads = {};
var server = http.createServer(function(req, res) {
....
我希望这能有所帮助
上传
在每次请求时都被设置为空对象({}
),它总是{}
请注意,该函数在所有请求上都被调用
全局变量在node.js中有特殊含义,因为所有模块都有一个局部作用域。
解决方案是在函数外部声明它
像这样
var uploads = {};
var server = http.createServer(function(req, res) {
....
我希望这对您有所帮助您的问题与全局变量无关-当在JavaScript中创建一个新变量时,它的前缀不带
var
,它是动态范围的AFAIK,这意味着它是全局变量。无论如何,如果您的变量确实是在函数之外声明的,我会感觉更好,因为它不仅是全局的,而且看起来也是全局的:
var uploads = {}
server = http.createServer(function(req, res) {
if (req.url == '/check') {
// ...
现在,让我们看看您真正的问题:您正在以一种非常奇怪的方式使用“强大”。一、 例如,我从未使用过强大的.IncomingForm
的on()
方法。我建议您使用parse()
方法,它为您提供一个key-value对象,其中key是
字段的名称,value是上传文件数据,例如服务器中文件的路径:
if (req.url == '/upload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
for (var filename in files) {
var file = files[filename];
var tracker = {filename: filename, progress:[], ended:false};
fs.readFile(file.path, function(err, filecontent) {
tracker.progress.push(filecontent);
tracker.ended = true;
});
uploads[filename] = tracker;
}
res.writeHead(200, {'content-type': 'text/html'});
res.write("<A href='/'>ok</a>");
res.end();
});
就是这样,希望这有帮助。请注意,我假设您需要解决一个问题;但是,如果您想测试
IncomingForm.on()
方法,这个答案将没有多大用处。我希望我做出了正确的猜测:)您的问题与全局变量无关-当在JavaScript中创建一个新变量时,没有前缀var
,它是动态范围的AFAIK,这意味着它是全局变量。无论如何,如果您的变量确实是在函数之外声明的,我会感觉更好,因为它不仅是全局的,而且看起来也是全局的:
var uploads = {}
server = http.createServer(function(req, res) {
if (req.url == '/check') {
// ...
现在,让我们看看您真正的问题:您正在以一种非常奇怪的方式使用“强大”。一、 例如,我从未使用过强大的.IncomingForm
的on()
方法。我建议您使用parse()
方法,它为您提供一个key-value对象,其中key是
字段的名称,value是上传文件数据,例如服务器中文件的路径:
if (req.url == '/upload') {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
for (var filename in files) {
var file = files[filename];
var tracker = {filename: filename, progress:[], ended:false};
fs.readFile(file.path, function(err, filecontent) {
tracker.progress.push(filecontent);
tracker.ended = true;
});
uploads[filename] = tracker;
}
res.writeHead(200, {'content-type': 'text/html'});
res.write("<A href='/'>ok</a>");
res.end();
});
就是这样,希望这有帮助。请注意,我假设您需要解决一个问题;但是,如果您想测试IncomingForm.on()
方法,这个答案将没有多大用处。我希望我的猜测是正确的:)