我将 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
块中,但这并没有解决问题。任何有关如何解决此问题的想法都将受到高度赞赏。谢谢!
如果致电
let tone = new ToneAnalysis().ToneAnalyser(input);
返回一个承诺然后你可以做类似的事情
tone.then(res.send.bind(res))
如果致电
let tone = new ToneAnalysis()`enter code here`.ToneAnalyser(input);
返回一个承诺然后你可以做类似的事情
tone.then(res.send.bind(res))
我会编辑快速路线以进行异步回调:
app.get('/api/tone', async (req, res) => {
const analyzer = new ToneAnalysis();
const analysis = await analyzer.ToneAnalyser(input);
return res.send({
tone: analysis
});
});