
本文详解 rasa 聊天机器人在本地网页(如 index.html)中“无响应”或返回 “undefined” 的常见原因,重点解决因 cors 策略导致的前后端通信失败问题,并提供可立即生效的启动命令与验证方法。
当你在 Visual Studio Code 中通过 rasa shell 或 rasa run 启动 Rasa 并测试正常,但将前端 HTML 页面(含自定义聊天小部件)部署到本地浏览器(如 file:// 协议或简易 HTTP 服务)后却收不到回复、仅显示 "undefined",绝大多数情况下是浏览器 CORS(跨域资源共享)策略拦截了前端 JavaScript 对 Rasa REST API 的请求。
Rasa 默认启动时不启用跨域支持。前端脚本(运行在 http://localhost:5500/ 或 file:// 等源)尝试向 http://localhost:5005/webhooks/rest/webhook 发送 POST 请求时,若 Rasa 服务未显式允许该来源,浏览器会直接阻止响应(即使后端已成功处理),导致 JavaScript 接收到空响应体或解析失败,最终显示 undefined。
✅ 正确启动方式(关键修复):
在终端中使用以下命令启动 Rasa 服务,显式启用 API 并开放所有来源的 CORS:
rasa run --enable-api --cors "*"
- --enable-api:启用 Rasa HTTP API(必需,否则 /webhooks/rest/webhook 不可用);
- --cors "*":允许任意域名(包括 localhost、127.0.0.1 及 file:// 协议页面)发起跨域请求。生产环境请替换为具体域名(如 --cors "https://your-website.com")以保障安全。
? 验证是否生效:
- 启动上述命令后,访问 http://localhost:5005/health,应返回 JSON 健康状态;
- 在浏览器开发者工具(F12 → Network 标签页)中发送一条消息,检查 webhook 请求的 Response Headers 是否包含 Access-Control-Allow-Origin: *;
- 若仍报错,请确认前端代码中请求 URL 正确(通常为 http://localhost:5005/webhooks/rest/webhook),且 payload 格式符合 Rasa REST Channel 规范:
fetch("http://localhost:5005/webhooks/rest/webhook", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
sender: "user123",
message: "Hello"
})
})
.then(res => res.json())
.then(data => console.log("Bot reply:", data[0]?.text || "No text received"));⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- ❌ 不要使用 rasa shell 部署——它仅提供 CLI 交互,不暴露 HTTP API;
- ❌ 避免在 file:// 协议下直接双击打开 HTML(部分浏览器严格限制其发起跨域请求),建议用轻量 HTTP 服务预览(如 VS Code 的 Live Server 插件或 python3 -m http.server 8000);
- ✅ 生产部署时务必移除 --cors "*",改用精确域名白名单,并配合反向代理(如 Nginx)统一处理跨域与 HTTPS。
通过以上配置,你的自定义前端小部件即可稳定连接本地 Rasa 服务,告别 undefined,实现真实对话响应。










