【问题标题】:Not being able to connect to MongoDB from AWS Lambda无法从 AWS Lambda 连接到 MongoDB
【发布时间】:2018-05-28 04:43:10
【问题描述】:

我正在尝试构建一个在请求时连接到 mlab 的 alexa 技能。我在我的代码中放置了多个 console.log() 消息,并观察到控制台里面

db.once('open', function callback() { console.log('a');}) 没有被执行。

查看 CloudWatch 日志时,我收到以下消息:

REPORT RequestId:1b57c8f8-61b6-11e8-9038-5fc7c131d222 持续时间:40.54 毫秒计费持续时间:100 毫秒内存大小:128 MB 使用的最大内存:51 MB

我使用了猫鼬规定的标准连接语句:

"use strict";
var Alexa = require("alexa-sdk");
const mongoose = require("mongoose");
var handlers = {

'LanguageIntent': function () {
  let uri = 'mongodb://my_uri';
  mongoose.connect(uri);
  let speechOutput;
  let db = mongoose.connection;
  db.on('error', console.error.bind(console, 'connection error:'));

  db.once('open', function callback() {
    console.log("I AM HERE");
  });
  console.log("Outside");
 }
}
exports.handler = function(event, context, callback){
  var alexa = Alexa.handler(event, context);
  alexa.registerHandlers(handlers);
  alexa.execute();
};

据我了解,请求没有超时,而且肯定还有其他一些我无法理解的问题。 cloudwatch 日志不显示“我在这里”。但是“外部”会记录在日志中。这让我觉得在建立连接的时候肯定有问题。

在这方面的任何帮助将不胜感激!

【问题讨论】:

  • 您需要验证您是否可以从该位置实际访问该实例作为您的首要任务。不建议在不使用承诺解析或回调的情况下调用 mongoose.connect()。有关更多详细信息,请参阅猫鼬文档中的 Connections。此外,您应该提供一个“完整”的简单列表,而不是“伪代码”,它只是确认连接是问题。见How to create a Minimal, Complete, and Verifiable example
  • 如前所述,“首要任务”是实际查看服务和托管 MongoDB 实例之间的连接是否可能。这涉及使用 Mlab 验证网络设置,以确保允许您的远程主机并且您也可以从任何其他位置进行连接。 AWS Lambda 也是如此,通过确保其他一切都在最小的“hello world”下工作,然后验证它是否可以与外部主机通信。将所有细节放入您的问题中。除了指出缺少的东西之外,这不是其他人可以真正“调试”的东西。所以展示一切。

标签: mongodb aws-lambda alexa alexa-skills-kit


【解决方案1】:

根据您的共享代码,如果连接详细信息和一切都正确,那么您可以通过增加超时值,因为第一次建立连接可能需要比通常查询更长的时间。它不影响任何事情。一旦它和我一起工作。

【讨论】:

  • 没有帮助。我将超时设置为 20 秒。仍然面临这个问题。
  • 我把 console.log(mongoose.connection.readyState); 语句放在 db.once(发现此状态表示“正在连接...”阶段。因此无法正常连接。
  • 我尝试了一些粗略的方法,比如引入一个 30 秒的 while 循环来等待连接到 mongodb。仍然没有进展。
  • 这可能是由于 lambda 函数的冷启动。尝试将超时设置为 1-2 分钟。只有您的第一次通话需要时间,连续通话非常快,因为您正在重复使用相同的连接。
【解决方案2】:

经过一周的调试冲刺后,我找到了问题的答案。我的代码格式为:

"use strict";
var Alexa = require("alexa-sdk");
const mongoose = require("mongoose");
var handlers = {
'LanguageIntent': function () {
  let uri = 'mongodb://my_uri';
  mongoose.connect(uri);
  let speechOutput;
  let db = mongoose.connection;
  db.on('error', console.error.bind(console, 'connection error:'));

  db.once('open', function callback() {
   console.log("I AM HERE");
  });
  console.log("Outside");
  this.response.speak("HI");
  this.emit(':responseReady');
}
exports.handler = function(event, context, callback){
  var alexa = Alexa.handler(event, context);
  alexa.registerHandlers(handlers);
  alexa.execute();
};

我注意到,当我将我的 reponse.speak 代码移动到 db.once 函数中时,它就开始无缝运行了。因此,构造代码的正确方法是:

db.once('open', function callback() {
   this.response.speak("HI");
   this.emit(':responseReady');
});

【讨论】:

    猜你喜欢
    • 2019-03-14
    • 2021-06-10
    • 2019-11-08
    • 2020-10-16
    • 1970-01-01
    • 2018-05-13
    • 2019-11-02
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多