Node.js进行微信公众号开发时遇到的小坑

错误描述

最近在用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