0

我尝试在 IBM 云功能中有多个操作。当某些节点命中时,我需要 Watson Assistant 来调用不同的。

我的问题是,只能在 Watson 助手的选项中放置一个 webhook。我知道我必须编写一个动作来检测发送的参数并调用正确的动作。我尝试使用 Axios NPM,如下所示,但是当 Watson Assistant 尝试运行它时它总是失败。它给了我授权错误。我当前的 IBM Cloud Function 名称空间是基于 CF 的。

这是我试图用来调用我的“电子邮件”操作的代码:

const axios = require("axios");
// Change to your "BASE_URL". Type in the "Web Action" url without the name of it at the end. (must NOT contains the end '/')
// All "Actions" must be within the same namespace.
const BASE_URL = "https://us-south.functions.cloud.ibm.com/api/v1/namespaces"
const POST = "post";
const GET = "get";
const ANY = "any";
const ALL = "all";

/* List all your API methods
    1. method - API Name (This is the "Actions" name at the end of the Web Action URL or just the name)
    2. attr - Attributes that should be available in the params object
    3. rule - Currently supports 2 rules;
                a) any - params is valid if "any" of the attributes are present
                b) all - params is valid only if all attributes are present
    4. httpmethod -Supports "POST" and "GET"
    5. contains - Use for validating GET URL parameters
*/
const API_METHODS = [{
        method: "Emails", // Change to your API method "Please put the function name located at the end of the url without "/" example "Email"
        attr: ["client_email", "department_email"],
        rule: ANY,
        httpmethod: POST,
        contains: null
    },
    {
        method: "testapi", // If Watson needs to "GET" information to a user or athenticate a user
        attr: [],
        rule: ALL,
        httpmethod: GET,
        contains: "?ID="
    },
]

// Returns true if the "params" is valid for the given API method
function isValidParam(method, params = {}) {
    var attributes = [];
    attributes = method.attr;
    var isAny = method.rule === ANY;
    for (let index = 0; index < attributes.length; index++) {
        const attr = attributes[index];
        if (isAny) {
            if (Object.hasOwnProperty.call(params, attr)) {
                return true;
            }
        } else {
            if (!Object.hasOwnProperty.call(params, attr)) {
                return false;
            }
        }
    }

    if (attributes.length === 0 && method.contains) {
        return (JSON.stringify(params).indexOf(method.contains) > -1)
    }

    // if the code reaches this position, inverse of "isAny" should return the actual validation status.
    return !isAny;
}

async function main(params) {
    var result = [];

    // Stop on first failure
    // We iterate through all API methods. Because there can be more than one matching API for the given param type
    for (let index = 0; index < API_METHODS.length; index++) {
        const apiMethod = API_METHODS[index];
        const url = BASE_URL + '/' + apiMethod.method;

        if (isValidParam(apiMethod, params)) {
            let response = apiMethod.httpmethod === POST ?
                await axios.post(url, params) :
                await axios.get(url + params); // Expects the parameter to be a string in this case like '?id=345343'

            console.log(response);

            result.push({
                sent: true,
                url: url,
                request: params,
            });
        }
    }

    return {
        sent: true,
        details: result
    };
}
// THe part of the code that needs to be copied to call other functions within the namespace.


/* const API_METHODS = [{
 method: "Emails", // Change to your API method "Please put the function name located at the end of the url without "/" example "Email"
 *   attr: ["bamboo_email", "latitude_email", "latest_r_email", "department_email"],
    rule: ANY,
    httpmethod: POST,
    contains: null
},
{
    method: "testapi", // If Watson needs to "GET" information to a user or athenticate a user
    attr: [],
    rule: ALL,
    httpmethod: GET,
    contains: "?ID="
},
]  */
4

0 回答 0