express与iOS ASI框架不兼容的问题
发布于 11 年前 作者 yidahis 4995 次浏览 最后一次编辑是 8 年前

我学习nodejs没多久,现在用nodejs写App后台。感觉nodejs写后台那叫一个惬意啊。但是今天用iOS ASI上传图片的时候报错:

Error: unrecognized content-type: multipart/form-data; charset=utf-8; boundary=0xKhTmLbOuNdArY-76652528-14BC-449D-A06D-9D108EB591D7

大概就是说这个http的header.content-type无法识别,仔细查看出错位置

at Form.parse (…node_modules/express/node_modules/connect/node_modules/multiparty/index.js:105:23)。 var m = contentType.match(CONTENT_TYPE_RE); if (!m) { index.js:105:23 handleError(new Error('unrecognized content-type: ’ + contentType)); return; }

看到这里,实际上就是上面验证CONTENT_TYPE_RE的时候出问题。找到相应位置发现 var CONTENT_TYPE_RE = /^multipart/(form-data|related);\s*boundary=(?:"([^"]+)"|([^;]+))$/i; 查看这里发现这个正则表达式没有考虑content-type的charset这个属性,原因找到了。由于自己对正则表达式不是很熟悉,就搞了一个比较笨的方法来解决问题,大家不要见笑。 我添加一个带判断charset的正则表达式:

var CONTENT_TYPE_RE_WITH_CHARSET = /^multipart/(form-data|related);\scharset=utf-8;\sboundary=(?:"([^"]+)"|([^;]+))$/i;

然后先判断不带charset的正则表达式,再判断带charset的,这样就可以了。代码如下.

var m = contentType.match(CONTENT_TYPE_RE); if (!m) { m=contentType.match(CONTENT_TYPE_RE_WITH_CHARSET); if(!m){ handleError(new Error('unrecognized content-type: ’ + contentType)); return; } }

第一次发帖,请大家多多鼓励,谢谢。

1 回复
回到顶部