求助:无需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}`); });
三、配置与测试
本地运行服务器:
执行node index.js,服务器会在 3000 端口启动。暴露本地端口到公网:
Alexa 要求端点必须是 HTTPS 且可公网访问,所以我们用ngrok来做内网穿透(先安装 ngrok)。
执行:ngrok http 3000你会得到一个类似
https://xxxx-xx-xx-xx-xx.ngrok.io的 HTTPS 地址,这就是你的临时公网端点。配置 Alexa 控制台:
打开你创建的 Alexa 技能,进入「构建」→「端点」,选择「HTTPS」,在「默认区域」输入你的 ngrok 地址加上/alexa-skill(比如https://xxxx-xx-xx-xx-xx.ngrok.io/alexa-skill),然后选择「我的开发端点是一个子域名,由 Amazon 证书颁发机构保护」,保存配置。测试技能:
进入 Alexa 控制台的「测试」标签,切换到「开发」模式,就可以语音或文字测试你的技能了!
四、进阶提示
- 请求签名验证:为了安全,建议开启 Alexa 的请求签名验证,SDK 提供了相应的中间件,你可以在 Express 里添加验证逻辑,防止恶意请求。
- 部署到云平台:本地测试后,可以把代码部署到 Heroku、AWS EC2 或者其他支持 Node.js 的云平台,这样就能拥有永久的 HTTPS 端点。
- 自定义意图:在 Alexa 控制台的「意图」页面添加更多自定义意图,然后在代码里对应的 Handler 处理逻辑即可。
内容的提问来源于stack exchange,提问作者Roster
相关产品推荐
相关产品推荐

