在本地运行Amazon Alexa技能,而不是AWS Lambda(JavaScript)



是否可以使用Ngrok代替AWS在本地运行Alexa技能?我在AWS Lambda中建立了一项技能,但我宁愿使用自己的服务器。我该怎么做才能在当地运行Alexa?

我尝试了https://github.com/alexa-js/alexa-app-server,但这很有意义,因为我需要重写我的整个代码:(更好的解决方案是http://docs.s.bespoken。工具/EN/最新/教程/tutorial_lambda_nodejs/但不是最好的。它仅适用于善良的意图,然后冻结:(

bespken命令的终端日志:

    BST: v0.9.35  Node: v7.8.0
Your URL for Alexa Skill configuration:
https://proxy.bespoken.tools?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d
INFO  2017-04-25T20:27:20.628Z Connected - proxy.bespoken.tools:5000
INFO  2017-04-25T20:27:26.812Z RequestReceived: POST /?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d ID: 1493152039146
INFO  2017-04-25T20:27:26.815Z Forwarding localhost:10000
Current hour: 24
Warning: Application ID is not set
INFO  2017-04-25T20:27:27.939Z ResponseReceived ID: 1493152039146
INFO  2017-04-25T20:28:10.755Z RequestReceived: POST /?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d ID: 1493152078963
INFO  2017-04-25T20:28:10.756Z Forwarding localhost:10000
Warning: Application ID is not set
INFO  2017-04-25T20:28:11.157Z ResponseReceived ID: 1493152078963
INFO  2017-04-25T20:28:51.073Z RequestReceived: POST /?node-id=33efccba-2246-477f-bbb8-2e1e510cce9d ID: 1493152113739
INFO  2017-04-25T20:28:51.073Z Forwarding localhost:10000
Warning: Application ID is not set
INFO  2017-04-25T20:28:51.995Z ResponseReceived ID: 1493152113739

是的,有几种解决方案可以在本地运行节点lambda。例如,我一直在使用node-lambda。像大多数解决方案一样,它是针对想要在本地测试然后轻松部署到AWS lambda的用户。

如果您想自己运行它们,我会注意到,MS和IBM已经实现了Lambda开源(这里是MS和IBM(。我实际上还没有自己尝试过,我会注意到,使用AWS,GCP和Azure,所有这些都为节点提供了lambda服务,因为这些市场是健康的,锁定是最小的,所以我觉得不需要能够运行我本人比诸如Dynamo之类的东西。

,但我也建议您继续追求BST。我正在使用一些自己的作品来测试自己的技能,因为我在听说他们的东西之前就开始了,但是我尝试过的(bstalexa(非常有用,我看到它们提供了您需要的其他一些作品易于有效测试您的技能。

这是一些示例代码,您可以使用这些示例代码轻松地在本地运行lambda,请调用此文件Alexalambda.js:

const log = require('console');
var AWS = require('aws-sdk');
AWS.config.region = "us-east-1";
AWS.config.update({
    accessKeyId: "----",
    secretAccessKey: "----",
});
/**
 * Wraps the actual underlying Alexa lambda initialization in a 
 * Promise. Injects test mocks where appropriate.
 */
var initializerPromise = new Promise(function(fulfill, reject) {
    // Mock out certain imports here if you want but not necessary
    /*
  var Module = require('module');
  var originalRequire = Module.prototype.require;
  Module.prototype.require = function() {
    if ((arguments[0] == 'S3FeedService') ||
        (arguments[0] == './lib/S3FeedService')) {
      return MockS3Service;
    } else if ((arguments[0] == 'WebsocketService') ||
               (arguments[0] == './lib/WebsocketService')) {
      return WSMockService;
    } else if ((arguments[0] == 'SQSService') ||
               (arguments[0] == './lib/SQSService')) {
      return SQSMockService;
    } else {
      return originalRequire.apply(this, arguments);
    }
  };*/
  // Import your actual lambda here.
  var lambda = require('../src/index.js');
  fulfill(lambda);
});
/**
 * The Alexa Lambda context object which is called upon completion
 * of lambda execution.  Also wraps the callback which contains the 
 * test assertion code of the caller.
 * @param callback - must be of the form function(error, result) {};
 * @returns
 */
function Context(callback) {
    this.clientContext = {"env": {}}; 
    this.callback = callback;
}
Context.prototype.done = function(error, result) {
    if (typeof error != "undefined" && error) {
        this.callback(error, null);
    } else {
        this.callback(null, result);
    }
}
Context.prototype.succeed = function(result) {
    this.callback(null, result);
}
Context.prototype.fail = function(error) {
    this.callback(error, null);
}
/**
 * The AlexaLambda object that's exposed for test cases.
 * @returns
 */
function AlexaLambda() {
}
/**
 * Executes the lambda function, provided an inputEvent and a 
 * callback.
 * @param inputEvent - the input event that includes the intent.
 * @param callback - called upon completion of lambda execution.
 */
AlexaLambda.prototype.execute = function(inputEvent, callback) {
    initializerPromise.then(function(lambda) {
        var context = new Context(callback);
        lambda.handler(inputEvent, context);
    });
}
/**
 * Export the lambda class, importers instantiate via new AlexaLambda();
 */
module.exports = AlexaLambda;

然后,您可以在这样的测试中使用此" Alexalambda"(就我而言,我正在使用摩托马(:

var AlexaLambda = require('./AlexaLambda');
var Event = require('./Event');  // My 'fake' Event class
describe("Guest User Test", function() {
  var alexaLambda = new AlexaLambda();      
  it("Alexa, open/launch 60db", function(done) {
    var event = Event.createLaunchEvent();
    alexaLambda.execute(event, function(error, result) {
      validateYourResultHere();
      done();
    })
  });

那么,这只是通过您使用的任何框架进行测试的问题。

您可以通过以下教程在本地测试您的Alexa技能:

如何在本地测试Alexa

最新更新