作为一个新手,最近在看《node.js实战》这本书,书中有一段实现一个照片上传功能的例子,我自己也敲了下来,由于书年代久远,node.js的发展太快了,很多东西都与现在不同了,在实现多张图片上传的功能时使用了multer中间件( multer),然后使用fs.rename这个API调换文件的位置,然后奇怪的事情出现了。先上一段代码:
由于一直报错,我就挨个排查bug,最后锁定在fs.rename的这个部分,于是打印了两次files[i].filename,发现第一次没有问题,第二次报错,不明白这是怎么回事?作用域吗? 最后的解决办法是用一个参数把files[i].filename保存起来,就OK了!
然而我还是不明白为什么,求大神解答一下!不胜感激!
multer新版api和之前的不一样,确认一下
@swfbarhr 第二段红字没看懂 为什么拿不到filename呢
@gjc9620 写了个简单的demo,代码: 你的预期是这样的: 实际它是这样的
有种东西叫变量提升,即,用var定义的变量会在这块作用域前先定义。 所以,以上的代码等同于:
又因为你的函数是异步的,所以在这里面取的 i 就是最前面这个全局的 i 。 不缓存的话,最简单的解决办法就是用 let 来处理。
@i5ting 多谢桑大,我又重新看了一遍multer的API
@swfbarhr 哈哈,应该是这个解释,作为新手受教了,多谢多谢
@zsxsoft 多谢你的回答,以前的确没有意识到过这个问题
@zsxsoft 对了,请问用缓存来解决的话应该如何解决呢?我目前只能想到用forEach遍历req.files取到的文件,或者再遍历一次files[i].filename,求大神解答
闭包都没学好,就用回调就是在作死了。。。
我只想说这个标题简直有点中二,不过我喜欢
这内容跟标题简直不搭边
只是一个变量的作用域的问题,闭包即可解决
@waksana 还不是为了让大神来解答
@joney-pinkman 的确的确!
@klesh 好!