在发出 POST 请求之前等待来自外部 API 的数据

Posted

技术标签:

【中文标题】在发出 POST 请求之前等待来自外部 API 的数据【英文标题】:Wait for data from external API before making POST request 【发布时间】:2018-07-14 19:17:59 【问题描述】:

我将 IBM Watson Tone Analyzer API 与 Express.js 和 React 结合使用。我有这段代码可以向 Watson API 发送一些测试:

// 音调分析器.js 类音调分析 构造函数() 常量参数 = 用户名:process.env.USERNAME, 密码:process.env.PASSWORD, 版本日期:'2018-01-31' this.Analyzer = new ToneAnalyzerV3(params); 音调分析器(输入) 让音调= this.Analyzer.tone(输入,(错误,音调)=> if (err) console.log(err.message) 让voiceTone =tone.document_tone.tones[0].tone_id; console.log(voiceTone) // 在 Node.js 控制台上记录正确的值 返回语音; ); 回声; module.exports = 音调分析;

然后我像这样在我的 Express 后端使用它:

// server.js const ToneAnalysis = require('./api/tone-analysisr'); 常量应用程序 = 快递(); 常量输入 = tone_input: '我很高兴', content_type: '文本/纯文本' app.get('/api/tone', (req, res) => 让音调=新音调分析()。音调分析器(输入); 返回 res.send( 音调:音调 ); );

我在这里从 React 进行 API 调用:

// 应用程序.js 组件DidMount() this.callApi() .then(res => 控制台.log(res.tone); // 在 Chrome 控制台上记录错误的值 ) .catch(err => console.log(err)); callApi = async () => const response = await fetch('/api/tone'); const body = 等待 response.json(); if (response.status !== 200) throw new Error(body.message); 控制台日志(正文); 返回身体; ;

我希望res.tone 的值是string,显示从音调分析功能(new ToneAnalysis().ToneAnalyser(input);)获得的音调。相反,我得到了

uri:...,方法:“POST”,标题:... 标题:..., uri:..., __proto__: 对象

我认为这是因为 res.send(...)tone 之前运行,具有来自 API 的值。我的问题是,如何让 res.send(...) 仅在 tone 具有值之后运行?

我尝试将this.Analyzer.tone(input, [callback]) 中的回调函数包装在async/await 块中,但这并没有解决问题。任何有关如何解决此问题的想法都将受到高度赞赏。谢谢!

【问题讨论】:

对话有网络功能。因此,您可以在对话中调用音调分析器。 【参考方案1】:

如果调用

let tone = new ToneAnalysis().ToneAnalyser(input); 

返回一个承诺然后你可以做类似的事情

tone.then(res.send.bind(res))

【讨论】:

它返回一个对象。但多亏了你的回答,我才明白。我修改了ToneAnalyser 方法以返回一个promise 而不是一个对象。然后我在server.js 中解决了它,我使用tone.then(...) 获取了返回值 很高兴我的回答有帮助

以上是关于在发出 POST 请求之前等待来自外部 API 的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular2 向外部 API 发出 POST 请求?

如何向外部 Rest Api 发出 Http Post 请求? [关闭]

Laravel 4 使用数据从控制器向外部 url 发出 post 请求

JavaScript 不等待来自端点的响应

是否可以在 Java 或 JavaScript 中发出 HTTP (POST) 请求而无需等待响应

使用来自 API 的 wp_remote_post 请求下载文件