You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS使用request库实现同步POST请求遇阻求助

问题分析与解决方案

你的问题核心在于**postRequest函数没有返回Promise**,导致await无法正确等待异步请求完成,进而出现执行顺序颠倒和打印出[object Promise]的情况。

具体原因:

  • request库本身是基于回调的异步API,你的postRequest只是调用了request但没有返回任何值(更没有返回Promise),所以await postRequest(options)其实是在等待一个undefined,requestToken函数会立刻返回一个未解决的Promise,导致console.log(test + 'TOT')先执行。
  • 而request的回调函数是异步触发的,所以里面的console.log(token + 'tet')会在之后执行,这就是输出顺序颠倒的原因。

修复方案:

把postRequest封装成返回Promise的函数,让await能够正确等待异步操作完成,同时调整对requestToken的调用方式。

修改后的完整代码如下:

const express = require('express');
const bodyParser = require('body-parser');
var request = require("request");
const app = express();
app.use(bodyParser.json());
var token = '';
process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

// 封装成返回Promise的函数
function postRequest(options) {
  return new Promise((resolve, reject) => {
    request(options, function (error, response, body) {
      if (error) {
        reject(error); // 出错时reject
        return;
      }
      token = (JSON.parse(body)).access_token;
      console.log(token + 'tet');
      resolve(token); // 成功时resolve返回token
    });
  });
}

async function requestToken() {
  var options = {
    method: 'POST',
    url: 'https://simplivity@xxxx/api/oauth/token',
    headers: {
      'Content-Type': 'application/json'
    },
    formData: {
      grant_type: 'password',
      username: 'administrator@vsphere.local',
      password: 'xxxx'
    }
  };
  try {
    var test = await postRequest(options)
    return test;
  } catch (error) {
    console.error(error);
    throw error; // 重新抛出错误让调用者处理
  }
}

// 正确调用async函数的方式:用.then()处理结果
requestToken()
  .then(test => {
    console.log(test + 'TOT');
  })
  .catch(err => {
    console.error('请求失败:', err);
  });

关键修改点:

  1. postRequest返回Promise:用new Promise包裹request调用,在回调中根据结果resolve或reject,这样await才能等待异步操作完成。
  2. 正确处理requestToken的返回值:因为requestToken是async函数,它返回的是Promise,所以需要用.then()来获取最终的test值,而不是直接赋值后打印。
  3. 错误处理优化:在requestToken的catch块中重新抛出错误,让调用者可以捕获处理。

这样修改后,执行顺序就会符合预期:先输出token值tet,再输出token值TOT。

内容的提问来源于stack exchange,提问作者lucky simon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:29:13