错误描述
最近在用nodejs+koa2进行微信公众号的开发,在自定义菜单的时候,遇到了一个小坑其实后来想想也不算什么坑,只不过一般不太会注意到罢了。无码言屌,上代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| const menu = { button: [ { type: 'click', name: '动漫', key: 'anime' }, { type: 'click', name: '电影', key: 'movie' }, { type: 'view', name: '关于我', url: 'https://bitibiti.com' } ] } const content = JSON.stringify(menu); const opt = { hostname: 'api.weixin.qq.com', method: 'POST', path: `/cgi-bin/menu/create?access_token=${accessToken}`, headers: { 'Content-Type': 'application/json', 'Content-Length': content.length } } const req = https.request(opt, (res) => { res.setEncoding('utf8'); let str = ''; res.on('data', (data) => str += data); res.on('end', () => { if (JSON.parse(str).errcode === 0) { console.log('menu create successfully'); } else { console.log('menu create unsuccessfully'); } }); }); req.on('error', (e) => console.error(e)); req.write(content); req.end();
|
返回如下信息:
1
| {"errcode":40019,"errmsg":"invalid button key size hint: [8uRf60839vr21]"}
|
invalid button key size…(懵逼脸,只有三个按钮啊!)
微信的错误信息是靠不住了,问问谷歌吧!
一翻搜索过后,终于在cnode找到了相关问题。点击查看原贴
原来是content-length的问题,js中一个中文字符计算长度为1,而http中,body是以字节为长度的,而一个中文一般为2-3个字节。所以Content-Length: content.length
会造成数据的截断。
解决方法
'Content-Length': new Buffer(content).length