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); });
关键修改点:
postRequest返回Promise:用new Promise包裹request调用,在回调中根据结果resolve或reject,这样await才能等待异步操作完成。- 正确处理
requestToken的返回值:因为requestToken是async函数,它返回的是Promise,所以需要用.then()来获取最终的test值,而不是直接赋值后打印。 - 错误处理优化:在
requestToken的catch块中重新抛出错误,让调用者可以捕获处理。
这样修改后,执行顺序就会符合预期:先输出token值tet,再输出token值TOT。
内容的提问来源于stack exchange,提问作者lucky simon
相关产品推荐
相关产品推荐

