Node.js中Google Recaptcha返回字符串而非JSON的问题
解决Google Recaptcha验证API返回字符串而非JSON的问题
你的问题出在POST请求的参数传递方式不符合Google Recaptcha接口的预期,导致接口返回文本格式而非JSON,进而无法直接通过scoreRecaptcha.data.success获取验证状态。
问题分析
Google的siteverify接口支持GET和POST请求,但:
- 若使用POST,需将参数放在请求体中,并设置
Content-Type为application/x-www-form-urlencoded - 你的代码用POST但把参数拼在URL里,这种情况下接口可能返回纯文本而非JSON,axios无法自动解析为对象
解决方案
方案1:改用GET请求(更简洁)
siteverify接口完全支持GET请求,直接通过params传递参数,axios会自动解析JSON响应:
async function validateCaptcha(req) { const recaptcha = process.env.CAPTCHA_PRIVATE; const token = req.body.token; const scoreRecaptcha = await axios.get( 'https://www.google.com/recaptcha/api/siteverify', { params: { secret: recaptcha, response: token } } ); return scoreRecaptcha.data.success; }
方案2:规范使用POST请求
如果坚持用POST,需将参数放在请求体,并设置正确的请求头:
async function validateCaptcha(req) { const recaptcha = process.env.CAPTCHA_PRIVATE; const token = req.body.token; const scoreRecaptcha = await axios.post( 'https://www.google.com/recaptcha/api/siteverify', new URLSearchParams({ secret: recaptcha, response: token }), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ); return scoreRecaptcha.data.success; }
临时兼容方案(若以上方法仍不生效)
如果接口还是返回字符串,可以手动解析响应:
async function validateCaptcha(req) { const recaptcha = process.env.CAPTCHA_PRIVATE; const token = req.body.token; const scoreRecaptcha = await axios.post( `https://www.google.com/recaptcha/api/siteverify?secret=${recaptcha}&response=${token}` ); // 手动解析字符串为JSON对象 const responseData = JSON.parse(scoreRecaptcha.data); return responseData.success; }
内容的提问来源于stack exchange,提问作者David Jiménez Lamas
相关产品推荐
相关产品推荐

