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

问题描述 投票:0回答:3

我将 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);
      }
      音调分析器(输入){
        让tones = this.Analyzer.tone(输入,(错误,音调)=> {
          if (err) console.log(err.message)
          让 voiceTone =tone.document_tone.tones[0].tone_id;
          console.log(voiceTone) // 在 Node.js 控制台上记录正确的值
          返回语音;
        });
        返回提示音;
     }
    }
    module.exports = ToneAnalysis;


然后我在 Express 后端上使用它,如下所示:


    // 服务器.js
    const ToneAnalysis = require('./api/tone-analysisr');
    常量应用程序 = Express();
    常量输入 = {
        tone_input: '我很高兴',
        内容类型:'文本/纯文本'
    }
    app.get('/api/tone', (req, res) => {
        让tone = new ToneAnalysis().ToneAnalyser(input);
        返回 res.send({
            语气:语气
        });
    });

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


    // 应用程序.js
    组件DidMount() {
        this.callApi()
          .then(res => {
            console.log(res.tone); // 在 Chrome 控制台上记录错误值
          })
          .catch(err => console.log(err));
      }

      callApi = async() => {
        const 响应=await fetch('/api/tone');
        const body =等待response.json();

        if (response.status !== 200) 抛出新错误(body.message);
        控制台.log(正文);
        返回主体;
      };

我希望

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
3个回答
1
投票

如果致电

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

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

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

0
投票

如果致电

let tone = new ToneAnalysis()`enter code here`.ToneAnalyser(input); 

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

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

0
投票

我会编辑快速路线以进行异步回调:

app.get('/api/tone', async (req, res) => {
    const analyzer = new ToneAnalysis();
    const analysis = await analyzer.ToneAnalyser(input);
    return res.send({
        tone: analysis
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.