【问题标题】:Third party npm package in openwhisk actions / IBM Cloud Functionsopenwhisk 操作/IBM Cloud Functions 中的第三方 npm 包
【发布时间】:2019-04-27 21:22:12
【问题描述】:

我是 OpenWhisk / IBM Cloud Functions 的新手。我试图使用 IBM Watson Assistant 构建一个基本的聊天机器人应用程序。 所以我所拥有的是从我的 Node.js 服务器调用的云功能操作,该操作具有与 Watson 服务交互的所有凭据,我使用“watson-developer-cloud”npm 包作为依赖项。当我在本地计算机上运行时,一切都按预期工作,但是,当我压缩目录并将其作为 OpenWhisk Web 操作上传时,它无法安装依赖项。

我遵循的程序是:

  1. 运行npm install
  2. 压缩当前目录下的所有文件(包括node_modules)
  3. 使用以下命令上传动作
    bx wsk action create chataction --kind nodejs:8 chatactionzip.zip
    (这里 chatactionzip 是压缩文件名)。

谁能帮我搞定这个工作?我正在上传目录结构的截图。

package.json 是这样的

`

{
  "name": "chataction",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "watson-developer-cloud": "^3.13.0"
  }
}

`

这是我的代码(我正在删除一些凭据,其余部分保持原样) `

const AssistantV1 = require('watson-developer-cloud/assistant/v1');

function main(params) {

    var inputText = params.inputText || 'input was not sent';
    //return {result: inputText}
    var assistant = new AssistantV1({
        username: '',
        password: '',
        url: '',
        //api_key: '',
        version: '2018-11-26'
    });

    var inputMessageParams = {
        input: {
            text: inputText
        },
        workspace_id: ''
    }


    assistant.message(inputMessageParams, function(err, result, response) {
        if(err) {
            console.log(err);
            return {err: err}
        }
        else {
            // console.log(response);
            // console.log(response.body.output.text);
            // console.log(response.data);
            return {result: response.body.output.text[0]}
        }
    });

    //return {notHit: 'npm not working'}
}

exports.main = main;

`

调用代码是这样的 `

const openwhisk = require('openwhisk');

options = {
    apihost: 'openwhisk.eu-gb.bluemix.net',
    api_key: ''
}

var ow =  openwhisk(options);
var params = {inputText: 'Hello'}
var name = 'chataction';
var blocking = true;
var result = true;
ow.actions.invoke({name, blocking, result, params})
.then((result) => {
    console.log(result);
});

`

【问题讨论】:

  • 您能澄清一下“无法安装依赖项”是什么意思吗?您是否看到了特定的错误消息?一般来说,我会说你正在做的步骤检查...你能分享一些代码吗?
  • 您在控制台上看到了什么错误?您是否尝试调用该操作?另外,你能提供你的package.json吗?
  • 检查你的package.json中的节点版本。
  • (不)与问题无关:您为什么使用 Cloud Functions 调用 Watson Assistant?这不能直接从您的节点应用程序中完成吗?
  • @tpei 我的意思是,当我作为普通 nodejs 应用程序运行代码时,我能够发送文本消息并从 watson 服务获得响应。但是当我将相同的代码放入一个动作并调用它时,我得到一个空对象作为回报..

标签: node.js ibm-cloud ibm-watson watson-conversation openwhisk


【解决方案1】:

乍一看,你创建的动作是chataction,但你调用的是ChatActionZip

【讨论】:

  • 很抱歉,这是我从其他文件粘贴到这里时打错了字。它仅在代码中是“聊天”。我现在已经编辑了帖子。
【解决方案2】:

几件事:

【讨论】:

  • 好的,所以我正在使用节点 8 的内置 watson-developer-cloud 模块 .. 非常感谢这个建议 :) 现在可以正常工作了
【解决方案3】:

无服务器操作是异步的,如果您使用的 API 已经返回 Promise,您需要将代码包装在 Promise 中或使用 try/catch

您的主要功能在您的方法 assistant.message() 调用完成之前结束

    return new Promise((resolve, reject) =>{
       assistant.message(inputMessageParams, function(err, result, response) {
          if(err) {
            console.log(err);
            reject({err: err})
         }
         else {
           // console.log(response);
           // console.log(response.body.output.text);
           // console.log(response.data);
           resolve( {result: response.body.output.text[0]})
         }
       });
    });

有关异步 javascript 的更多信息,请参阅此处的文档:https://console.bluemix.net/docs/openwhisk/openwhisk_reference.html#openwhisk_ref_javascript

【讨论】:

  • 非常感谢,这解决了我的问题。所以我现在正在使用 Promises,它按照我想要的方式工作。谢谢很多人:)
猜你喜欢
  • 2019-03-23
  • 2016-07-05
  • 1970-01-01
  • 2018-08-05
  • 2018-12-07
  • 2019-12-15
  • 2018-05-19
  • 2019-09-06
  • 2021-06-05
相关资源
最近更新 更多