作为一个新手,最近在看《node.js实战》这本书,书中有一段实现一个照片上传功能的例子,我自己也敲了下来,由于书年代久远,node.js的发展太快了,很多东西都与现在不同了,在实现多张图片上传的功能时使用了multer中间件( multer),然后使用fs.rename这个API调换文件的位置,然后奇怪的事情出现了。先上一段代码:
1.PNG
由于一直报错,我就挨个排查bug,最后锁定在fs.rename的这个部分,于是打印了两次files[i].filename,发现第一次没有问题,第二次报错,不明白这是怎么回事?作用域吗? 最后的解决办法是用一个参数把files[i].filename保存起来,就OK了! 2.PNG
然而我还是不明白为什么,求大神解答一下!不胜感激!
@gjc9620 写了个简单的demo,代码: untitled1.png 你的预期是这样的: untitled2.png 实际它是这样的 untitled3.png
有种东西叫变量提升,即,用var定义的变量会在这块作用域前先定义。 所以,以上的代码等同于: untitled4.png
又因为你的函数是异步的,所以在这里面取的 i 就是最前面这个全局的 i 。 不缓存的话,最简单的解决办法就是用 let 来处理。 untitled5.png
@zsxsoft 对了,请问用缓存来解决的话应该如何解决呢?我目前只能想到用forEach遍历req.files取到的文件,或者再遍历一次files[i].filename,求大神解答