如何在不借助第三方服务的情况下将AWS Lex集成到Node.js网站
集成AWS Lex聊天机器人到Node.js网站的分步指南
1. 配置AWS权限与凭证
- 创建一个IAM用户,附加
AmazonLexRunBotsOnly策略(仅授予调用Lex机器人的权限) - 获取该用户的
Access Key ID和Secret Access Key - 在Node.js项目根目录创建
.env文件,添加以下内容(绝对不要把凭证硬编码到代码里):AWS_ACCESS_KEY_ID=你的Access Key ID AWS_SECRET_ACCESS_KEY=你的Secret Access Key AWS_REGION=你的Lex机器人所在区域(比如us-east-1) LEX_BOT_ID=你的机器人ID(Lex控制台机器人详情页可查) LEX_BOT_ALIAS_ID=你的机器人别名ID(发布别名后可查) LEX_USER_ID=任意唯一用户标识字符串(比如会话ID)
2. 安装依赖包
在项目目录执行以下命令:
npm install express dotenv @aws-sdk/client-lex-runtime-v2
express:用于搭建后端API接口dotenv:加载环境变量@aws-sdk/client-lex-runtime-v2:AWS Lex v2版本客户端SDK(推荐使用v2,v1已逐步淘汰)
3. 编写Lex调用逻辑
创建lex-service.js文件,封装调用Lex的函数:
const { LexRuntimeV2Client, RecognizeTextCommand } = require("@aws-sdk/client-lex-runtime-v2"); require('dotenv').config(); const client = new LexRuntimeV2Client({ region: process.env.AWS_REGION, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY } }); async function sendMessageToLex(userInput) { const input = { botId: process.env.LEX_BOT_ID, botAliasId: process.env.LEX_BOT_ALIAS_ID, localeId: "en_US", // 根据你的机器人语言设置调整 sessionId: process.env.LEX_USER_ID, text: userInput }; const command = new RecognizeTextCommand(input); try { const response = await client.send(command); return response.messages[0].content; } catch (error) { console.error("调用Lex出错:", error); return "抱歉,暂时无法回复,请稍后再试。"; } } module.exports = { sendMessageToLex };
4. 搭建后端API接口
创建server.js文件,用Express搭建接收前端请求的接口:
const express = require('express'); const { sendMessageToLex } = require('./lex-service'); require('dotenv').config(); const app = express(); app.use(express.json()); app.use(express.static('public')); // 托管前端静态文件 // 处理聊天消息的API app.post('/api/chat', async (req, res) => { const { message } = req.body; if (!message) { return res.status(400).json({ error: "请输入消息内容" }); } const botResponse = await sendMessageToLex(message); res.json({ response: botResponse }); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`服务器运行在 http://localhost:${PORT}`); });
5. 编写前端聊天界面
在项目根目录创建public文件夹,添加index.html:
<!DOCTYPE html> <html> <head> <title>Lex聊天机器人</title> <style> .chat-container { max-width: 600px; margin: 20px auto; } .chat-messages { height: 400px; border: 1px solid #ccc; padding: 10px; overflow-y: auto; margin-bottom: 10px; } .user-message { text-align: right; margin: 5px 0; padding: 8px; background: #e3f2fd; border-radius: 8px; display: inline-block; } .bot-message { text-align: left; margin: 5px 0; padding: 8px; background: #f5f5f5; border-radius: 8px; display: inline-block; } #message-input { width: 80%; padding: 8px; border-radius: 4px; border: 1px solid #ccc; } #send-btn { padding: 8px 16px; border: none; background: #2196f3; color: white; border-radius: 4px; cursor: pointer; } </style> </head> <body> <div class="chat-container"> <div class="chat-messages" id="chat-messages"></div> <input type="text" id="message-input" placeholder="输入消息..."> <button id="send-btn">发送</button> </div> <script> const chatMessages = document.getElementById('chat-messages'); const messageInput = document.getElementById('message-input'); const sendBtn = document.getElementById('send-btn'); async function sendMessage() { const message = messageInput.value.trim(); if (!message) return; addMessage(message, 'user'); messageInput.value = ''; try { const response = await fetch('/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message }) }); const data = await response.json(); addMessage(data.response, 'bot'); } catch (error) { addMessage("连接出错,请重试", 'bot'); } } function addMessage(text, sender) { const messageDiv = document.createElement('div'); messageDiv.className = `${sender}-message`; messageDiv.textContent = text; chatMessages.appendChild(messageDiv); chatMessages.scrollTop = chatMessages.scrollHeight; } sendBtn.addEventListener('click', sendMessage); messageInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') sendMessage(); }); </script> </body> </html>
6. 测试运行
- 终端执行
node server.js启动服务器 - 浏览器访问
http://localhost:3000,输入消息测试机器人响应
关键注意事项
- 安全问题:永远不要在前端代码中暴露AWS凭证,必须通过后端中转调用Lex
- 机器人发布:确保你的Lex机器人已发布到某个别名,未发布的机器人无法被外部调用
- 区域匹配:AWS客户端配置的区域必须和Lex机器人所在区域一致
- 调试:调用失败时,可查看AWS CloudWatch中的Lex日志排查问题
内容的提问来源于stack exchange,提问作者Sanjana G
相关产品推荐
相关产品推荐

