分类:未分类
不撞南墙心不死,一个multiparty花了二天时间没搞定
其实没什么,只是在小程序里做一个上传图片的功能。
前端用微信自己提供的上传控件。
后端用nodejs+express+multiparty
一开始的时候,我看网上说用connect-multipart,刚准备试一下,才发现这玩意已不被express推荐。
然后又看到有人说直接用bodyparse就可以了,结果发现新版本的bodyparse根本不支持multipart/form,不能用于上传文件。
然后就用了multiparty。
真是大坑啊。
由于我现在用了router,所以建立server的时候是在router前面就已经建了。
所以到了最终操作multiparty的时候,我只要New一个form就好了。
然后用form.parse来解析,发现没用,收不到文件。
于是跑去用multer,这个东西是express在文档里直接支持的,但是试了一下没效果。
这时翻回来用multiparty,在winscp刷新了一下,发现原来已经收到了N个文件,之前测试的时候留的,当时看不到,是因为winscp不刷新的话,即使打开一百次文件夹都看不到新文件。
这时才知道这玩意可以用。
大喜过望,但是可惜的是,form.parse里的callback没用,只有在一种情况下它起作用,那就是当创建form的时候路径写错了,就可以在callback里打印err.message。除此之外,是绝对没用的。
如果直接在form.parse后面写res.send来向前端返回数据,那么等于都不知道有没有上传成功就贸然回复。
后来看到有人说在express2和3里,bodyparse还能管着multipart/form类型,所以一定要把json和encode两种类型单独写,不要直接写一个app.use(bodyparse)。
但是我本来就没有这么写,所以这个答案对我没意义。
而且我用nmp list express查了一下,当前版本是4.x,在这个版本中bodyparse已经被阉割了。
不过我一直怀疑这个答案是最接近真相的,于是我把bodyparse给注释了,测试结果是:没用。
然后用bing查英文资料,有个老外说他遇到的问题是80k以上的文件就会无法进行form.parse,他的解决方案是用busboy,我不想就这么放弃,所以没采纳。
还有个老外也说有这个问题,但最后他自己说他是在两个地方多次require(multiparty)导致的,而且他建议我们不要用app.use,但我没这些毛病啊。
最后,终于找到一篇博客,这老外说express4下要用multiparty,但官方文档太简单了,没有卵用,所以他自己写了一个示例。
然后我照着他的示例终于拿到了fields。
因为他用到了一个我完全没想到的事件,form.on(‘field’,function(name,value){})
当然,他的写法事实上官方文档里也不是没有。
这种写法的思路是将autoFile设为false,从而能够得到part事件、close事件,自己处理文件流。
然而经测,part事件和close都没有触发。
结果就是,我可以拿到表单内容,也可以拿到文件,但是永远也无法知道文件的名称。因为文件名称是multiparty自己生成的临时名称。
其实办法不是没有,大不了我每次弄个临时文件来放文件,转移文件之后把文件夹给删了,每次一个文件,就不怕找不到文件夹,而且我还准备了一个更坑爹的做法,就是发两次请求,第一次把json发过来,用json中的名称建好文件夹等着它,然后第二个请求就对号入座。
但是真的不甘心啊,这也太麻烦了吧。
另外令我无语的是,form.on(‘field’,callback)会多次触发,有几个表单项就触发几次,而且我们可以想像的是,fields是收到请求立刻就被解析出来的,而文件什么时候收完,什么时候存储完成,这都是multiparty自己在后面黑着做的,既然form.parse自带的callback无效,那我还有什么办法呢?写一个定时器一直刷文件夹??
这个中间件明明是一个使用人数超多的产品,为什么我遇到这么大一个问题却找不到答案呢?
如果说我的代码写得有问题,那么应该收不到文件,或者拿不到field,但问题是两者都可以做到,真是要被它搞疯了。
如果按我的习惯,我是不会为这么一个中间件花这么多时间的,但是现在就是花了这么多时间,真是太扯了。
最后,我把官方文档又仔细看了一遍,终于把问题搞定了,Part事件就是当原始的请求来了一截之后就触发,当有一个field来了,它就会触发,有一个文件来了,它也会触发。
不过可惜的是,文件上传并不是一个连续的过程,而是分块的,而且好像微信默认就是分块的,结果而我现在的写法只能收到第一块,这一点可以从form.on(‘progress’,(bytesReceived, bytesExpected)=>{})得知,收是收了很多次,但是最后写成的文件只有第一次收的大小。
所以现在的问题就是怎么把20K以上的文件收完整。
现在收不完,close事件就永远也不会被触发。
不行只好读一下multiparty源码,看看它到底怎么回事。
node.js cannot find module ‘mongodb’
话说,想在项目里用mongodb,结果node报错。
上网一查,光安装了mongo本身是不行的。
还得用npm安装一下相关的东东
操作如下(第二步是项目根目录)
npm install mongodb -g cd /path/to/my/app/folder npm link mongodb
小程序出现3 not found wxss编译错误怎么办
好久没搞小程序了,打开开发工具就是疯狂地更新安装,安装了几个新版本之后,说写写代码,结果遇到wxss文件编译错误,而且最搞怪的是什么2 not found ……3 not found,这算什么提示?
还好我上网查了一下,不然得卡在这里不知道多久。
解决方案如下:在控制台输入openVendor() 打开文件夹, 自己打开此文件删除wcc.exe,wcsc.exe两文件即可! 输入无反应找到此文件夹找到指定文件删除即可。
Linux变量和文件的区别
echo可以输出变量的内容
cat只能输出文件或重定向数据的内容
用cat $x,如果说不存在,那么$x就是变量。
变量的好处是重新登录之后就没有了,不用专门去rm
有哪些必须熟练的BASH快捷键?
大部分快捷键其实没什么意义,我把它们划上了删除线,比较有价值的保留。特别有价值的加粗
编辑命令
- Ctrl + a :移到命令行首
- Ctrl + e :移到命令行尾
Ctrl + f :按字符前移(右向)Ctrl + b :按字符后移(左向)- Alt + f :按单词前移(右向)
- Alt + b :按单词后移(左向)
- Ctrl + xx:在命令行首和光标之间移动(去上一次光标停留点,连按的话有种跳来跳去的感觉)
- Ctrl + u :从光标处删除至命令行首
- Ctrl + k :从光标处删除至命令行尾
- Ctrl + w :从光标处删除至字首
- Alt + d :从光标处删除至字尾
Ctrl + d :删除光标处的字符Ctrl + h :删除光标前的字符- Ctrl + y :粘贴至光标后
Alt + c :从光标处更改为首字母大写的单词Alt + u :从光标处更改为全部大写的单词Alt + l :从光标处更改为全部小写的单词Ctrl + t :交换光标处和之前的字符- Alt + t :交换光标处和之前的单词
- Alt + Backspace:与 Ctrl + w ~~相同~~类似,分隔符有些差别,后者只能删除到空格处,但我们很多时候用管道符什么的是不会用空格的,所以这个极其有用。
重新执行命令
- Ctrl + r:逆向搜索命令历史
- Ctrl + g:从历史搜索模式退出
- Ctrl + p:历史中的上一条命令
- Ctrl + n:历史中的下一条命令
- Alt + .:使用上一条命令的最后一个参数
控制命令
- Ctrl + l:清屏
- Ctrl + o:执行当前命令,并选择上一条命令
Ctrl + s:阻止屏幕输出- Ctrl + q:允许屏幕输出
- Ctrl + c:终止命令
- Ctrl + z:挂起命令
Bang (!) 命令
- !!:执行上一条命令
- !blah:执行最近的以 blah 开头的命令,如 !ls
- !blah:p:仅打印输出,而不执行
!$:上一条命令的最后一个参数,与 Alt + . 相同!$:p:打印输出 !$ 的内容!*:上一条命令的所有参数!*:p:打印输出 !* 的内容^blah:删除上一条命令中的 blah- ^blah^foo:将上一条命令中的 blah 替换为 foo
- ^blah^foo^:将上一条命令中所有的 blah 都替换为 foo
Nw-js中如何避免弹出新窗口?
摸索了如下几种方式:
1、使用iframe,然后对$('a[target=_blank]')进行处理
,这个办法肯定是可以的,但是iframe太奇怪了,你把一个页面套在另外一个页面中,这样搞简直不是做本地程序的道理,虽然网上有人用iframe实现了一个浏览器,但对于有洁癖的人来说实在忍不了。
2、使用nw.Window,官方提供了一个所谓的new-win-policy事件来处理类似需求,然而根本没效果,从网上查外国论坛的说法,人家都说没见过任何成功的案例,所以从这个里跳出来的窗口仍然没有比较合理的处理办法,还是在DOM里查找$('a[target=_blank]')。google官方的文档里可以用chrome.App.window.getAll(),但是得到的Object其实根本没法处理。而且就算可以,我们也不能等窗口已经弹出再关掉吧?
3、使用<webview>tag,这个东西可以像iframe一样套在页面中,而且这个东西默认就是不许弹窗的,chrome官方还提供了newwindow事件来通知我们有人要弹窗了,你不必跑到dom里去挑三拣四,所以这个是最好的办法,但问题这个标签根本不稳定,遇到动不动就崩溃,而且无法找到原因,看样子和flash有关。(12/4更新:我已经搞定,目前已无崩溃现象)
官方文档2:webview tag
我记得很多年前我搞过electron,但现在只记得有这么一回事,而不知道怎么搞了。而且相关的工具链太长了,Nw-Js好像简单很多,所以选择了nw-js,但是现在感觉有点后悔,还不如直接搞IE内核。
复习windows命令行CD命令的用法
这玩意和linux不一样。
如果要进入d盘下的xx目录,直接cd d:\xx是没用的。
cd d:也是没用的
必须先d:
然后再cd xx
我去,这都忘到哪里去了,卡我半天呢。
用virtualbox安装win7虚拟机需要注意的问题
硬盘要选择动态变化,并且最好是分成多个块,避免文件太大到时候无法写入了。
在网上下载的iso文件,其实很多还是用GHOST来安装系统的。
如果用了。最好是先用它们提供的分区软件把虚拟机的硬盘分区一下,不过只要分一个区就行了,毕竟分给整个虚拟机的硬盘空间也不会很多。分完区之后直接把ghost恢复到这个分区就OK。
网上这些系统安装文件真的是非常坑的,说什么纯净,根本没法信。
最大的忠告是不要装win7虚拟机,不如装个xp的。
linux命令帮助中文版安装方法
说实话,我不是怕英文,实在是看英文帮助效率太低,每次用的时候上网查感觉不值得。上网搜了一下,有人给出了安装包和安装说明,但是和我遇到的实际情况不同。
首先下载http://download.chinaunix.net/down.php?id=13232&ResourceID=6537&site=1
注意,这种地址一定要用浏览器下载,直接wget是没用的,下载完肯定是一个html文件。
先下载到本地,然后用ftp上传到服务器。
然后在当前用户的根目录建一个文件夹用于放这些文档(为了安全)
mkdir
-p
man
/zh_CN
回到刚才下载的文件目录,解压缩得到man-pages-zh_CN-1.5文件夹。
打开一看,里面一堆文件,就是没有configure
如果有人让你执行./configure命令,不要理他,因为根本没配置文件。
所以直接make就好了。
make完了,会生成一个utf8目录(默认装的是utf8的中文包)。
然后把utf8给复制到刚才自己手动创建的那个目录下。
cp
-r UTF-8/* ~/man/zh_CN/
大功告成了。
不信你man ls试试。