我正在使用带有Express.js和React的IBM Watson Tone Analyzer API。我有这个代码向Watson 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])
?
我尝试在async/await
块中的endTime
中包装回调函数,但这并没有解决问题。任何关于如何解决这个问题的想法将受到高度赞赏。谢谢!
答案 0 :(得分:0)
如果致电
let tone = new ToneAnalysis().ToneAnalyser(input);
返回一个承诺然后你可以做类似的事情
tone.then(res.send.bind(res))