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

pgpifvop  于 2023-11-17  发布在  Node.js
关注(0)|答案(3)|浏览(107)

我正在使用IBM沃森音调分析器API与React. js和React.我有这个代码发送一些测试到沃森API:

// tone-analyser.js
    class ToneAnalysis {
      constructor() {
        const params = {
          username: process.env.USERNAME,
          password: process.env.PASSWORD,
          version_date: '2018-01-31'
        }
       this.Analyzer = new ToneAnalyzerV3(params);
      }
      ToneAnalyser(input) {
        let tones = this.Analyzer.tone(input, (err, tone) => {
          if (err) console.log(err.message)
          let voiceTone = tone.document_tone.tones[0].tone_id;
          console.log(voiceTone) // Logs the right value on Node.js console
          return voiceTone;
        });
        return tones;
     }
    }
    module.exports = ToneAnalysis;

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

// server.js
    const ToneAnalysis = require('./api/tone-analyser');
    const app = express();
    const input = {
        tone_input: 'I am happy',
        content_type: 'text/plain'
    }
    app.get('/api/tone', (req, res) => {
        let tone = new ToneAnalysis().ToneAnalyser(input);
        return res.send({
            tone: tone
        });
    });


我在这里从React调用了一个API:

// App.js
    componentDidMount() {
        this.callApi()
          .then(res => {
            console.log(res.tone); // Logs the wrong value on Chrome console
          })
          .catch(err => console.log(err));
      }

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

        if (response.status !== 200) throw new Error(body.message);
        console.log(body);
        return body;
      };


我期望res.tone的值是string,显示从音调分析函数(new ToneAnalysis().ToneAnalyser(input);)获得的音调。

{
      uri: {...},method: "POST", headers: {...}}
       headers: {...},
       uri: {...},
       __proto__: Object
    }


我认为这是因为res.send(...)tone从API获得值之前运行。我的问题是,如何使res.send(...)仅在tone获得值之后运行?
我尝试将this.Analyzer.tone(input, [callback])中的回调函数 Package 在async/await块中,但这并没有解决这个问题。任何关于如何解决这个问题的想法都将受到高度赞赏。谢谢!

628mspwn

628mspwn1#

如果调用

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

字符串
返回一个promise,然后你可以做一些类似于

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

pbpqsu0x

pbpqsu0x2#

如果调用

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

字符串
返回一个promise,然后你可以做一些类似于

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

wf82jlnq

wf82jlnq3#

我会编辑express路由,以获得一个callback:

app.get('/api/tone', async (req, res) => {
    const analyzer = new ToneAnalysis();
    const analysis = await analyzer.ToneAnalyser(input);
    return res.send({
        tone: analysis
    });
});

字符串

相关问题