You need to enable JavaScript to run this app. Node.js中FormData提交Instagram OAuth请求后如何获取响应
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中FormData提交Instagram OAuth请求后如何获取响应

核心问题原因
  • 语法结构错误:exports.instaToken = async (code) => {} 提前闭合了函数花括号,后续的表单组装、提交逻辑全部不在函数作用域内,根本没法被正确调用
  • 异步逻辑不匹配:formData.submit()是回调式API,本身不会返回代表异步结果的Promise,直接await拿到的是该方法同步返回的原生HTTP请求对象,根本没有等待回调执行完成
  • 回调返回值无效:在submit的回调函数里写的return res,作用域仅在回调内部,外层async函数完全接收不到这个返回值;同时接口返回的响应体是Buffer类型,没有做格式转换就直接返回,就会出现拿到缓冲区对象的问题
修正代码实现

helper.js 重写

把回调式的提交逻辑封装为Promise,适配async/await的等待逻辑:

const { FormData } = require('form-data');

exports.instaToken = async (code) => {
  const formData = new FormData();
  formData.append('client_id', KEY_ID);
  formData.append('client_secret', KEY_SECRET);
  formData.append('grant_type', 'authorization_code');
  formData.append('redirect_uri', REDIRECT_URI);
  formData.append('code', code);

  // 将回调API包装为Promise,确保async可以正确等待结果
  return new Promise((resolve, reject) => {
    formData.submit('https://api.instagram.com/oauth/access_token', (err, res, body) => {
      if (err) return reject(err);
      // 将Buffer类型的响应体转为字符串后解析为JSON对象
      const parsedBody = JSON.parse(body.toString());
      resolve({
        statusCode: res.statusCode,
        statusMessage: res.statusMessage,
        responseData: parsedBody
      });
    });
  });
};

index.js 路由层调整

增加接口返回状态校验,同时注意传参要符合OAuth流程的要求:

router.get('/token', async (req, res, next) => {
  try {
    // 这里需要取Instagram授权后回调带回的临时授权码,不是硬编码的access token字符串
    const authCode = req.query.code;
    const tokenResponse = await instaHelper.instaToken(authCode);

    // 对接口返回状态做校验,遇到非200状态直接抛出错误走catch流程
    if (tokenResponse.statusCode !== 200) {
      throw new Error(tokenResponse.responseData.error_message || 'Instagram令牌接口请求失败');
    }

    req.data = tokenResponse.responseData;
    req.status = 200;
    req.message = 'Token Fetched Successfully';
    next();
  } catch (e) {
    req.status = 400;
    next(e);
  }
});
补充注意点
  • 不要在submit的回调里直接return值,这个返回值不会传递到外层调用处
  • 接口返回的body默认是Buffer格式,必须转成字符串再做JSON解析,否则拿到的就是原始缓冲区对象
  • OAuth流程里临时授权码是一次性的,请求成功换取长有效期token后这个code就会失效,不能重复用

内容的提问来源于stack exchange,提问作者Shubham Bhardwaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.14 01:36:03