【新手求解答】node.js的使用中出现了问题,fs.rename竟然有这么大的威力吞噬掉了一个变量?
发布于 9 年前 作者 dufemeng 5861 次浏览 最后一次编辑是 8 年前 来自 问答

作为一个新手,最近在看《node.js实战》这本书,书中有一段实现一个照片上传功能的例子,我自己也敲了下来,由于书年代久远,node.js的发展太快了,很多东西都与现在不同了,在实现多张图片上传的功能时使用了multer中间件( multer),然后使用fs.rename这个API调换文件的位置,然后奇怪的事情出现了。先上一段代码:

1.PNG

由于一直报错,我就挨个排查bug,最后锁定在fs.rename的这个部分,于是打印了两次files[i].filename,发现第一次没有问题,第二次报错,不明白这是怎么回事?作用域吗? 最后的解决办法是用一个参数把files[i].filename保存起来,就OK了! 2.PNG

然而我还是不明白为什么,求大神解答一下!不胜感激!

16 回复

multer新版api和之前的不一样,确认一下

@swfbarhr 第二段红字没看懂 为什么拿不到filename呢

@gjc9620 写了个简单的demo,代码: untitled1.png 你的预期是这样的: untitled2.png 实际它是这样的 untitled3.png

有种东西叫变量提升,即,用var定义的变量会在这块作用域前先定义。 所以,以上的代码等同于: untitled4.png

又因为你的函数是异步的,所以在这里面取的 i 就是最前面这个全局的 i 。 不缓存的话,最简单的解决办法就是用 let 来处理。 untitled5.png

@dufemeng @gjc9620 @zsxsoft 4楼回答已经很详细了,个人认为要学习node,先要把JavaScript基础巩固下。

@i5ting 多谢桑大,我又重新看了一遍multer的API

@swfbarhr 哈哈,应该是这个解释,作为新手受教了,多谢多谢

@zsxsoft 多谢你的回答,以前的确没有意识到过这个问题

@zsxsoft 对了,请问用缓存来解决的话应该如何解决呢?我目前只能想到用forEach遍历req.files取到的文件,或者再遍历一次files[i].filename,求大神解答

闭包都没学好,就用回调就是在作死了。。。

@dufemeng 作用域的问题,简单地讲在rename 前面加个let filename=files[i].path,创建一个块级变量,引用它就行了。

来自酷炫的 CNodeMD

我只想说这个标题简直有点中二,不过我喜欢

这内容跟标题简直不搭边

只是一个变量的作用域的问题,闭包即可解决

@waksana 还不是为了让大神来解答

@joney-pinkman 的确的确!

回到顶部