日期:2014-05-16  浏览次数:20367 次

《Nodejs入门》一书中存在的问题分析[转]

要和上一篇转载一起看。

《Nodejs入门》一书确实很好的入门工具书,不过其中的一些代码还是和我们的实际开发环境不同。比如该书中的最后一个例子,上传图片到服务器。

其中存在的问题的一部分源代码如下(处理上传文件):

Js代码

function upload( res, req){  
    console.log("request upload mehtod");  
    var form = new formidable.IncomingForm();  
    form.parse( req, function( error, fields, files){     
        fs.renameSync(files.upload.path, "tmp/"+filename+".png");   
        res.writeHead(200,{"Content-Type":"text/html"});  
        res.write("<img src='/show'/>");   //发送/show请求  
        res.end();  
    });  
}  

这里用到了formidable第三方模块,上面的代码总是报错“can not find File or Directory: c:......”;
原因是formidable默认上传文件的保存路径与项目路径不在同一相同路径中。如我的工程是在e盘。所以需要设置form.uploadDir = "tmp";//指向工程中的tmp文件夹

另外,fs.renameSync()保存文件会抛出异常,为了能让程序正常运行,这里需要添加try{}catch(e){}

如果我们像上传图片的同时,想在前台的一个输入框内设置一下名称,后台通过formidable如何获取这个字段的值呢?

Js代码

...  
form.parse(req, function(error, fields, files){  

    //filename为<input>标签中name属相的值  
    var filename = fields["filename"];    

     ...  

});  
...  

综上所述下面是upload方法完整的代码:

Js代码

function upload( res, req){  
    console.log("request upload mehtod");  

    var form = new formidable.IncomingForm();  
    form.uploadDir = "tmp"; 
    form.parse( req, function( error, fields, files){  
        console.log("parsing done");  
        var filename = fields['filename'];  
        console.log("filename = " + filename);  

       try{  
            fs.renameSync(files.upload.path, "tmp/"+filename+".png");  
        }catch( e){  
            console.log(e);  
        }
        res.writeHead(200,{"Content-Type":"text/html"});  
        res.write("<img src='/show'/>");   //发送/show请求  
        res.end();  
    });  
}