《Nodejs入门》一书中代码存在的问题
发布于 3年前 作者 aaroncanter 4018 次浏览

《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为&lt;input&gt;标签中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("&lt;img src='/show'/&gt;");   //发送/show请求  
    res.end();  
});  

}

14 回复

顶,昨天试验的时候刚好遇到这个问题,还在郁闷哪里的问题,就看到楼主的解答!谢谢楼主

彼此彼此,共同学习~

已经跟进了。还跟进了《nodejs入门》中提到的nodejs不支持缓存,使用eclipse插件来查看数据传递的问题。

我也看了,照着示例敲代码,看到那个以非阻塞方式来访问页面的时候,怎么一直都是阻塞的,页面一直加载,根本进不去。 var exec = require(“child_process”).exec;

function start() { console.log(“Request handler ‘start’ was called.”); var content = "empty";

exec("ls -lah", function (error, stdout, stderr) { content = stdout; });

return content; }

function upload() { console.log(“Request handler ‘upload’ was called.”); return "Hello Upload"; }

exports.start = start; exports.upload = upload;

不知道怎么回事

顺便问下 楼主,我安装eclipse的node调试插件后,如何配合debug的config,我的一直报错,我发表过一篇文章,不知道您是如何解决的?

自己回答下,因为我用的是window下安装node,没有源码和类库,所以导致这个问题…我试了下cygwin下 是wonderful。。。哈哈

不好意思。这几天一直有事。问题解决了 吗?这个是我iteye上的写的,你可以看一下。 http://baiyejianxin.iteye.com/admin/blogs/1401775

我当时遇到一个问题,是安装了迅雷的游戏加速器。导致LSP被修改了。导致无法访问。一直等待状态。你看看是不是也是类似的问题。至于书里面写的那段例子我测试是没有问题的。我在windows下就OK。

@aaroncanter 多谢多谢。 恩 搞的差不多了,但还是没有弄出来,可能是我项目没有建好吧 反正debug后project Explorer 里node-5858都出来了,也打了断点但是就是进不去。enter image description here

我觉得不是你代码的问题。我猜测是网络的问题。你用360安全卫士中–功能大全–修复网络(LSP)修复一下事实。我当初遇到的问题也是发送请求之后一直不执行代码段。修复了一下网络,一切正常了。

@zhengpan 恩,这个问题我苦恼了一天了

看到帖子都是2012年的…

回到顶部