Node.js 无法在createDirectLine(botframework webchat)中成功传递Javascript变量,导致403错误
每次webchat会话,我都会从正在与之交谈的restify服务中检索一个令牌。我使用directline机密获取令牌。已正确检索令牌。当我通过在html中输入来手动使用令牌时,webchat会呈现。当我在函数中传递Javascript变量时,我无法创建directline。一些指导值得赞赏。一个解决办法是在html中使用secret,但我宁愿不这样做 我尝试了多个语法来传递变量:window.WebChat.createDirectLine{webChatToken}或webChatToken}或{webChatToken}或token:webChatToken和{token:webChatToken} 唯一有效的方法是在html中手动输入令牌 我使用index.js中已有的restify服务器作为示例bot来侦听和处理令牌请求: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
// 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));
希望这有帮助 多谢各位。不确定是令牌属性的设置还是代码的美观造成了这个问题;-成功了!