调用Facebook v3.0翻译服务遇400错误,求问题排查
先看你碰到的报错:
Unhandled rejection StatusCodeError: 400 - "Unsupported post request. Object with ID 'XXXXXX XXXXXX' does not exist, cannot be loaded due to missing permissions, or does not support this operation. Please read the Graph API documentation”,错误类型为GraphMethodException,错误码100,错误子码33
咱们一步步拆解问题,大概率是这几个地方出了错:
1. 应用ID填错了(最可能的元凶)
错误里提到的对象ID带空格XXXXXX XXXXXX,但Facebook的应用ID是纯数字串,根本不会有空格。你代码里的my_app_id肯定是复制的时候手抖了——要么把应用名称当成ID填了,要么复制ID时带了多余的空格。
赶紧去Facebook开发者后台找你的应用,在「基本设置」里就能看到纯数字的应用ID,把它准确替换掉代码里的my_app_id,别带任何多余字符。
2. 请求参数的传递方式不对
你现在把native_strings塞到qs里,但POST请求的翻译数据应该放在请求体里,还要让request-promise自动处理JSON格式。你当前的写法会把数组转成URL编码的参数,这完全不符合API的要求。
给你改好的代码:
const request = require('request-promise'); // 替换成你的正确应用ID和令牌 const uri = 'https://graph.facebook.com/v3.0/你的纯数字应用ID/translations?access_token=你的应用令牌'; const options = { method: 'POST', uri: uri, json: true, // 让模块自动处理JSON请求体和响应 body: { native_strings: [{"text":"Test String", "description": "This is a test string."}] } }; request(options) .then(function (res1) { console.log('翻译请求成功:', res1); // 注意:如果这不是在Express之类的HTTP服务路由里,下面两行的res是未定义的,要注释掉 // res.write('request done : ' + JSON.stringify(res1)); // res.end(); }) .catch(function(err) { // 必须加错误捕获,不然会出现Unhandled rejection console.error('请求出错详情:', err); });
3. 应用令牌权限不够
虽然你说令牌是从工具资源管理器拿的,但要确认它有app_translations权限(管理应用翻译的权限)。要是令牌没这个权限,API肯定会拒绝你。你可以在Graph API Explorer里检查令牌的权限列表,确保包含app_translations。
额外提醒
- 你原来代码里的
res.write和res.end,如果这不是在HTTP服务器的回调函数里(比如Express的路由处理),res对象是不存在的,会触发新错误,记得调整或注释掉。 - 一定要加上
.catch捕获异常,不然会出现Unhandled rejection的报错,这也是你当前错误提示里的一部分。
内容的提问来源于stack exchange,提问作者AlbertOu

