Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法在createDirectLine(botframework webchat)中成功传递Javascript变量,导致403错误_Node.js_Botframework_Web Chat - Fatal编程技术网

Node.js 无法在createDirectLine(botframework webchat)中成功传递Javascript变量,导致403错误

Node.js 无法在createDirectLine(botframework webchat)中成功传递Javascript变量,导致403错误,node.js,botframework,web-chat,Node.js,Botframework,Web Chat,每次webchat会话,我都会从正在与之交谈的restify服务中检索一个令牌。我使用directline机密获取令牌。已正确检索令牌。当我通过在html中输入来手动使用令牌时,webchat会呈现。当我在函数中传递Javascript变量时,我无法创建directline。一些指导值得赞赏。一个解决办法是在html中使用secret,但我宁愿不这样做 我尝试了多个语法来传递变量:window.WebChat.createDirectLine{webChatToken}或webChatToken

每次webchat会话,我都会从正在与之交谈的restify服务中检索一个令牌。我使用directline机密获取令牌。已正确检索令牌。当我通过在html中输入来手动使用令牌时,webchat会呈现。当我在函数中传递Javascript变量时,我无法创建directline。一些指导值得赞赏。一个解决办法是在html中使用secret,但我宁愿不这样做

我尝试了多个语法来传递变量:window.WebChat.createDirectLine{webChatToken}或webChatToken}或{webChatToken}或token:webChatToken和{token:webChatToken}

唯一有效的方法是在html中手动输入令牌

我使用index.js中已有的restify服务器作为示例bot来侦听和处理令牌请求:

// Create HTTP server and Cors
let server = restify.createServer();
server.pre(cors.preflight);
server.use(cors.actual);
server.listen(process.env.port || process.env.PORT || 3978, function() {
});

// Listen for bot requests.
server.post('/api/messages', (req, res) => {
    adapter.processActivity(req, res, async (context) => {
        await bot.run(context);
    });
});

// Listen for token requests.
server.get('/api/token',
    async function(req, res) {
        const result = await fetch('https://webchat.botframework.com/api/tokens', {
            method: 'GET',
            headers: {
                Authorization: `Bearer ${ process.env.directLineSecret }`
            }
        });
        const token = await result.json();
        console.log(token);
        res.send(token);
    });

以及html和Javascript代码中的webchat客户端。在本例中,它正在与restify服务器的本地实例通信

    <div id="webchat" role="main"></div>   
        <script>
            //get token
            const webChatToken = getToken();

            window.WebChat.renderWebChat({
            directLine: window.WebChat.createDirectLine({ webChatToken }),
            renderMarkdown: markdownIt.render.bind(markdownIt),
            store,
            // styling
            styleOptions: {
            },
            userID: 'N/A',
            username: 'Web Chat User',
            locale: 'nl-nl'
          }, document.getElementById('webchat'));

            async function getToken() {
            const res = await fetch('http://localhost:3978/api/token');
            const token = await res.json();
            return token;
          }
        </script>
我期待一个工作webchat客户端。在chrome开发扩展中,我看到403帖子被禁止。 directline api的相应响应:

{ 错误:{ 代码:BadArgument, 消息:无效的令牌或密码 }
}

直达线路选项具有令牌属性,而不是webChatToken属性。您需要在options对象中将token值设置为webChatToken。查看下面的代码片段和Direct Line Documentation,了解有关初始化Web聊天和Direct Line客户端的更多详细信息

(async function () {
  const res = await fetch('http://localhost:3978/api/token', { method: 'GET' });
  const webChatToken = await res.json();

  window.WebChat.renderWebChat({
    directLine: window.WebChat.createDirectLine({ token: webChatToken })
  }, document.getElementById('webchat'));

  document.querySelector('#webchat > *').focus();
})().catch(err => console.error(err));

希望这有帮助

多谢各位。不确定是令牌属性的设置还是代码的美观造成了这个问题;-成功了!