Watson Node.js SDK中Async/Await使用的版本兼容问题咨询
嗨,我来帮你梳理下这个问题,之前做Watson聊天机器人的时候也踩过类似的坑!
首先得澄清一个容易混淆的点:你提到的“Node.js SDK 6.1.3”大概率是两个东西的混淆——要么是Bluemix(现在叫IBM Cloud)给你的应用分配的Node.js运行时版本,要么是Watson官方的Node.js SDK版本。不管是哪种情况,都有办法解决async/await的兼容问题:
一、如果是Bluemix的Node.js运行时版本为6.1.3(不支持原生async/await)
Node.js 6.x本身确实不支持原生的async/await语法,这是语言层面的限制,和Watson SDK无关。解决办法有两个:
直接升级Node.js运行时版本
在你的项目根目录的package.json里添加engines字段,指定一个支持async/await的Node.js版本(比如14.x,IBM Cloud支持多个稳定版本):"engines": { "node": "14.x" }部署应用到Bluemix时,平台会自动拉取你指定的Node.js版本,这样就能直接用async/await了。
用Babel转译代码(不升级运行时的备选)
如果暂时没法升级运行时,可以通过Babel把async/await语法转译成Node.js 6.x支持的代码。需要安装@babel/core、@babel/preset-env、@babel/node等依赖,配置.babelrc文件,然后修改启动命令为babel-node index.js(假设你的入口文件是index.js)。
二、如果是Watson Node.js SDK版本为6.1.3(不返回Promise)
旧版本的Watson SDK可能默认只支持回调函数,不返回Promise,导致没法直接用await调用。这种情况更简单:
手动安装高版本的Watson SDK
在你的项目里执行命令安装最新版(或支持Promise的版本):npm install watson-developer-cloud@latest --save或者指定一个明确的版本(比如v5.x及以上,从这个版本开始SDK方法会在不传入回调时返回Promise)。更新后,你的
package.json里的依赖会记录这个新版本,部署到Bluemix时,平台会安装你指定的SDK,而不是默认的旧版本。另外,现在Watson的官方SDK已经更名为
ibm-watson,如果你是新项目,建议直接迁移到这个包,它完全支持Promise和async/await,用法更简洁。
额外提示
不管哪种方案,更新后你的artpromise和randomartist这些基于Promise的函数,都可以直接用await来调用,然后把结果返回给Watson聊天机器人的用户,流程和你原本的设计完全一致。
内容的提问来源于stack exchange,提问作者Maeror

