需求: 写个接口给前端,前端传图片给你,然后你调用下微信的接口 https://api.weixin.qq.com/wxa/img_sec_check?access_token=ACCESS_TOKEN
,将结果返回给前端。
第一眼看到,感觉就是很普通的一个简单的需求,直接用axios即可,代码类似如下:
const accessToken = await wxUtil.getMPAccessToken();
const url = `https://api.weixin.qq.com/wxa/img_sec_check?access_token=${accessToken}`;
const form_data = new FormData();
form_data.append("media", fs.createReadStream(file.path));
const request_config = {
method: "post",
url,
headers: {
"Content-Type": "multipart/form-data"
},
data: form_data
};
const {data} = await axios(request_config);
ctx.body = data
然而发现微信接口返回的是
{"errcode":41005,"errmsg":"media data missing hint: [M5C_Wa05271538]"}
或者412错误。
此时如果用request库去请求,发现是正常的
let opt = {
url,
method: "POST",
formData: {
buffer: {
value: fs.readFileSync(file.path),
options: {
filename: file.name,
contentType: file.type,
}
},
},
};
rp(opt,(err, res, body) => {console.log(body})
但用request有个问题:不能将它的请求结果返回给ctx.body。
所以改用request-promise
库,最终代码如下:
const { file, model: { wxModel } } = ctx.state;
const accessToken = await wxUtil.getMPAccessToken();
const url = `https://api.weixin.qq.com/wxa/img_sec_check?access_token=${accessToken}`;
var options = {
method: 'POST',
uri:url,
formData: {
name: 'media',
file: {
value: fs.createReadStream(file.path),
options: {
filename: 'test.jpg',
contentType: 'image/jpg'
}
}
}
};
const result = await rp(options)
.then(function (body) {
return body;
})
.catch(function (err) {
return err;
});
fs.unlinkSync(file.path);
ctx.body = JSON.parse(result);
我在axios库中纠结了几个小时,期间尝试了各种方式,在此记录下。
这个帖子有很好的说明:
关于axios在node中post的使用