【问题标题】:Wait for data from external API before making POST request在发出 POST 请求之前等待来自外部 API 的数据
【发布时间】: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 块中,但这并没有解决问题。任何有关如何解决此问题的想法都将受到高度赞赏。谢谢!

【问题讨论】:

  • 对话有网络功能。因此,您可以在对话中调用音调分析器。

标签: node.js reactjs express asynchronous ibm-watson


【解决方案1】:

如果调用

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

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

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

【讨论】:

  • 它返回一个对象。但多亏了你的回答,我才明白。我修改了ToneAnalyser 方法以返回一个promise 而不是一个对象。然后我在server.js 中解决了它,我使用tone.then(...) 获取了返回值
  • 很高兴我的回答有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
相关资源
最近更新 更多