【问题标题】:Using global variable in node.js在 node.js 中使用全局变量
【发布时间】:2011-09-14 15:15:48
【问题描述】:

我有一个简单的例子:

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);
            })
        });
    };
});

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

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

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

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

    现在,让我们看看你的真正问题:你以一种非常奇怪的方式使用了强大的功能。一方面,我从未使用过formidable.IncomingFormon() 方法。我建议你使用parse()方法,它为你提供了一个key-value对象,其中key是<input type="file">字段的名称,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.parse() 将在调用回调之前处理所有文件。您将拥有所有可用的文件以及它们的路径。当然,在这个例子中,我们的tracker.progress 将只包含一组数据——这将是完整的文件内容。

    另外,请注意,您将用于上传文件的表单应具有enctype='multipart/form-data' 属性:

    <form action='/upload' method='POST' enctype='multipart/form-data'>
    

    就是这样,希望对你有帮助。请注意,我假设您需要解决问题;但是,如果您想测试 IncomingForm.on() 方法,则此答案不会有太大用处。希望我猜对了:)

    【讨论】:

      【解决方案2】:

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

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

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

      像这样。

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2012-06-14
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-02
        • 2017-12-16
        相关资源
        最近更新 更多