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

求助:无需Amazon Lambda,用Node.js开发Alexa技能自定义HTTP端点

Node.js 搭建 Alexa 技能自定义 HTTP 端点完整指引

嘿,我刚好做过类似的东西,给你一步步拆解,附上可直接运行的示例代码,帮你快速跨过这个瓶颈!

一、准备依赖

首先,我们需要三个核心包:

  • ask-sdk-core:Amazon 官方的 Alexa 技能开发核心 SDK(替代旧版的 alexa-sdk,功能更全)
  • express:轻量的 Node.js HTTP 服务器框架,用来搭建自定义端点
  • body-parser:解析 Alexa 发送的 JSON 请求体

初始化项目并安装依赖:

npm init -y
npm install ask-sdk-core express body-parser

二、完整代码示例

创建一个 index.js 文件,把下面的代码复制进去,每部分都加了注释:

// 导入依赖
const express = require('express');
const bodyParser = require('body-parser');
const { SkillBuilders } = require('ask-sdk-core');

// 1. 定义技能的请求处理程序
// 启动请求处理(用户打开技能时触发)
const LaunchRequestHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'LaunchRequest';
  },
  handle(handlerInput) {
    const speechText = '欢迎使用我的自定义Alexa技能!你可以说"你好"来和我互动。';
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};

// 自定义意图处理(比如用户说"你好"时触发)
const HelloIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'HelloIntent';
  },
  handle(handlerInput) {
    const speechText = '你好呀!很高兴见到你😊';
    return handlerInput.responseBuilder
      .speak(speechText)
      .getResponse();
  }
};

// 错误处理程序
const ErrorHandler = {
  canHandle() {
    return true;
  },
  handle(handlerInput, error) {
    console.log(`Error handled: ${error.message}`);
    const speechText = '抱歉,我没听懂你说的话,可以再说一遍吗?';
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};

// 2. 构建 Alexa 技能实例
const skill = SkillBuilders.custom()
  .addRequestHandlers(
    LaunchRequestHandler,
    HelloIntentHandler
  )
  .addErrorHandlers(ErrorHandler)
  .create();

// 3. 搭建 Express HTTP 服务器
const app = express();
const port = process.env.PORT || 3000;

// 解析 JSON 请求体(Alexa 发送的请求是 JSON 格式)
app.use(bodyParser.json());

// 定义自定义端点,必须是 POST 方法(Alexa 只会用 POST 请求)
app.post('/alexa-skill', async (req, res) => {
  try {
    // 把请求传给 Alexa SDK 处理,得到响应
    const response = await skill.invoke(req.body);
    // 返回响应给 Alexa
    res.json(response);
  } catch (error) {
    console.error('处理请求出错:', error);
    res.status(500).send('服务器内部错误');
  }
});

// 启动服务器
app.listen(port, () => {
  console.log(`Alexa 技能端点已启动,监听端口 ${port}`);
});

三、配置与测试

  1. 本地运行服务器:
    执行 node index.js,服务器会在 3000 端口启动。

  2. 暴露本地端口到公网:
    Alexa 要求端点必须是 HTTPS 且可公网访问,所以我们用 ngrok 来做内网穿透(先安装 ngrok)。
    执行:

    ngrok http 3000
    

    你会得到一个类似 https://xxxx-xx-xx-xx-xx.ngrok.io 的 HTTPS 地址,这就是你的临时公网端点。

  3. 配置 Alexa 控制台:
    打开你创建的 Alexa 技能,进入「构建」→「端点」,选择「HTTPS」,在「默认区域」输入你的 ngrok 地址加上 /alexa-skill(比如 https://xxxx-xx-xx-xx-xx.ngrok.io/alexa-skill),然后选择「我的开发端点是一个子域名,由 Amazon 证书颁发机构保护」,保存配置。

  4. 测试技能:
    进入 Alexa 控制台的「测试」标签,切换到「开发」模式,就可以语音或文字测试你的技能了!

四、进阶提示

  • 请求签名验证:为了安全,建议开启 Alexa 的请求签名验证,SDK 提供了相应的中间件,你可以在 Express 里添加验证逻辑,防止恶意请求。
  • 部署到云平台:本地测试后,可以把代码部署到 Heroku、AWS EC2 或者其他支持 Node.js 的云平台,这样就能拥有永久的 HTTPS 端点。
  • 自定义意图:在 Alexa 控制台的「意图」页面添加更多自定义意图,然后在代码里对应的 Handler 处理逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:18:22