如何通过Node.js为IBM Watson设置上下文变量并传递至前端
如何在Node.js中传递IBM Watson上下文变量到前端?
先看你贴的代码片段,有个致命的拼写错误:JSON.stringfy应该是JSON.stringify——这个小失误很可能就是导致上下文没正确传递的核心原因。除此之外,还要确保你传递上下文的方式符合Watson Assistant的响应格式,前端也能正确解析。
下面是一步步的解决方案:
1. 修正JSON序列化的拼写错误
手动序列化上下文时一定要注意拼写,不过其实大多数情况下,Node.js的res.send()会自动把JavaScript对象序列化为JSON,所以你甚至不需要手动调用JSON.stringify。
2. 正确更新并返回上下文对象
这里给你两种常见场景的正确代码示例:
场景1:直接自定义上下文并返回给前端
如果是你自己维护上下文(不通过Watson SDK调用),代码应该这样写:
// 假设这是你的Node.js路由处理函数 app.post('/watson/chat', (req, res) => { // 从请求中获取现有上下文(如果前端之前传过来的话),没有则初始化空对象 let context = req.body.context || {}; const user_name = "MJ"; // 将自定义值添加到上下文对象 context.user_name = user_name; // 模拟Watson返回的输出内容 const output = { text: ["Hey there! Let's keep chatting."] }; // 正确返回响应:直接传递对象,res.send会自动处理JSON序列化 res.send({ output: output, context: context // 这里不要手动stringify,除非前端明确需要字符串格式 }); });
场景2:使用IBM Watson SDK调用并更新上下文
如果是通过Watson Assistant的Node.js SDK对话,需要确保在SDK返回的响应中更新上下文,再返回给前端:
const AssistantV2 = require('ibm-watson/assistant/v2'); const { IamAuthenticator } = require('ibm-watson/auth'); // 初始化Watson Assistant客户端 const assistant = new AssistantV2({ version: '2021-06-14', authenticator: new IamAuthenticator({ apikey: 'YOUR_WATSON_API_KEY', }), serviceUrl: 'YOUR_WATSON_SERVICE_URL', }); app.post('/watson/chat', async (req, res) => { const { sessionId, input, context } = req.body; try { // 调用Watson Assistant的message接口 const watsonResponse = await assistant.message({ assistantId: 'YOUR_ASSISTANT_ID', sessionId: sessionId, input: input, context: context // 传递前端传来的现有上下文 }); // 将自定义变量添加到Watson返回的上下文里 watsonResponse.result.context.user_name = "MJ"; // 返回完整的Watson响应给前端,包含更新后的上下文 res.send(watsonResponse.result); } catch (error) { console.error('Watson API Error:', error); res.status(500).send('Failed to connect to Watson Assistant'); } });
3. 前端如何接收并使用上下文变量
前端请求接口后,解析JSON响应就能拿到上下文里的变量了,比如用fetch的示例:
// 假设之前保存的上下文对象 let existingContext = {}; fetch('/watson/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ input: { text: "Hi" }, context: existingContext }) }) .then(response => response.json()) .then(data => { // 更新本地保存的上下文 existingContext = data.context; // 获取自定义的user_name变量 const userName = data.context.user_name; // 渲染到页面上 document.getElementById('user-display').textContent = `Welcome back, ${userName}!`; });
额外注意事项
- 确保Watson Assistant的对话流程中没有重置你添加的上下文变量(比如某些节点的配置会清空上下文)。
- 如果前端拿到的上下文是字符串格式(比如你手动
stringify了),记得用JSON.parse()解析后再使用。
内容的提问来源于stack exchange,提问作者bharadhwaj
相关产品推荐
相关产品推荐

