You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不借助第三方服务的情况下将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. 测试运行

  1. 终端执行node server.js启动服务器
  2. 浏览器访问http://localhost:3000,输入消息测试机器人响应

关键注意事项

  • 安全问题:永远不要在前端代码中暴露AWS凭证,必须通过后端中转调用Lex
  • 机器人发布:确保你的Lex机器人已发布到某个别名,未发布的机器人无法被外部调用
  • 区域匹配:AWS客户端配置的区域必须和Lex机器人所在区域一致
  • 调试:调用失败时,可查看AWS CloudWatch中的Lex日志排查问题

内容的提问来源于stack exchange,提问作者Sanjana G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:40:23