在node.js中使用全局变量

时间:2011-09-14 15:15:49

标签: 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.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);
            })
        });
    };
});

为什么“检查”返回空上传?在这种情况下我应该使用全局变量吗?

2 个答案:

答案 0 :(得分:5)

你的问题与全局变量无关 - 当在JavaScript中创建一个新变量而没有var作为前缀时,它是动态范围的AFAIK,这意味着它是全局的。无论如何,如果你的变量确实在函数之外声明,不仅全局,而且看起来全局,我会觉得更好:

var uploads = {}
server = http.createServer(function(req, res) {
    if (req.url == '/check') {
    // ...

现在,让我们看看你的真正的问题:你以一种非常奇怪的方式使用强大的。例如,我从未使用on()的{​​{1}}方法。我建议你使用formidable.IncomingForm方法,它为你提供了一个键值对象,其中键是parse()字段的名称,值是上传文件数据,例如路径服务器中的文件:

<input type="file">
在调用回调之前,

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.parse()将只包含一组数据 - 这将是完整的文件内容。

另请注意,您用于上传文件的表单应具有tracker.progress属性:

enctype='multipart/form-data'

就是这样,希望这会有所帮助。请注意,我假设您需要解决问题;但是,如果你想测试<form action='/upload' method='POST' enctype='multipart/form-data'> 方法,那么这个答案就不会有用了。我希望我做出了正确的猜测:)

答案 1 :(得分:-1)

upload在每个请求上都设置为空对象({}),它始终为{}

请注意,所有请求都会调用该函数

全局变量在node.js中具有特殊含义,因为所有模块都具有本地范围。 解决方案是在函数之外声明它。

喜欢这个。

var uploads = {};
var server = http.createServer(function(req, res) {
   ....

我希望这会有所帮助