javascript - 如何将Lambda函数中的Mongo Atlas数据库与Mongoose连接

标签 javascript mongodb mongoose lambda serverless-framework

我正在使用无服务器框架将后端部署到 API Gateway 和 AWS Lambda。

这是我针对这个特定 lambda 函数的 serverless.yml。 这是一个每小时运行一次的 cron 作业。

 cron:
     handler: handler.transferHandler
     events:
     - schedule: rate(1 hour)

现在,当我在本地主机上测试时,它工作得很好。但是当我部署到 aws 时,出现以下错误:

    MongoDB connection error. Please make sure MongoDb is running. { MongoError: failed to connect to server [undefined:27017] on first connect [MongoError: getaddrinfo ENOTFOUND undefined undefined:27017]
    at Pool.<anonymous> (/var/task/node_modules/mongodb-core/lib/topologies/server.js:336:35)
    at emitOne (events.js:96:13)
    at Pool.emit (events.js:188:7)
    at Connection.<anonymous> (/var/task/node_modules/mongodb-core/lib/connection/pool.js:280:12)
    at Connection.g (events.js:292:16)
    at emitTwo (events.js:106:13)
    at Connection.emit (events.js:191:7)
    at Socket.<anonymous> (/var/task/node_modules/mongodb-core/lib/connection/connection.js:189:49)
    at Socket.g (events.js:292:16)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at connectErrorNT (net.js:1021:8)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)
  name: 'MongoError',
  message: 'failed to connect to server [undefined:27017] on first connect [MongoError: getaddrinfo ENOTFOUND undefined undefined:27017]' }

这是我的 handler.js 中的函数:

exports.transferHandler = function transferHandler(event, context) {

  context.callbackWaitsForEmptyEventLoop = false;
  mongoose.connect(mongoString, {useMongoClient: true});
  const db = mongoose.connection;

  db.on("error", (err) => {
     console.log("MongoDB connection error. Please make sure MongoDb is running.", err);
     process.exit();
  });

  db.once('open', () => {
      BookingModel
          .find({})
          .then((bookings) => {
            ...
          })
          .catch((err) => {
              console.log(err);
          })
          .finally(() => {
            db.close();
          });
    });
};

最佳答案

在这个问题上坚持了两周后,我了解到我需要在 serverless.yml 中指定环境变量才能使其正常工作。我的函数从未连接到数据库,因为我的 mongo 字符串从未在 lambda 中设置。希望这对某人有帮助。

provider:
  name: aws
  runtime: nodejs6.10
  stage: production
  region: us-west-1
  environment:
    MONGODB_URL: ${env:MONGODB_URL}
    S3_BUCKET: ${env:S3_BUCKET}
    S3_BUCKET_REPORT: ${env:S3_BUCKET_REPORT}
    STRIPE_CLIENT_ID: ${env:STRIPE_CLIENT_ID}
    STRIPE_PUBLIC_KEY: ${env:STRIPE_PUBLIC_KEY}
    STRIPE_SECERET_KEY: ${env:STRIPE_SECERET_KEY}
    JWT_SECRET: ${env:JWT_SECRET}
    SEND_BIRD_TOKEN: ${env:SEND_BIRD_TOKEN}
    SEND_BIRD_APP_ID: ${env:SEND_BIRD_APP_ID}
    MANDRILL_APIKEY: ${env:MANDRILL_APIKEY}

关于javascript - 如何将Lambda函数中的Mongo Atlas数据库与Mongoose连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48594646/

相关文章:

javascript - Javascript 中的 constructor() 和 super() 方法

javascript - 使用 AngularJs Controller 动态设置背景图像

node.js - 从 Mongoose 中的嵌入文档中检索分页结果

node.js - 每天或每月间隔的交易总和

node.js - Mongoose 不保存已编辑的文档

node.js - Mongoose 选择要从 findOneAndUpdate 返回的字段

node.js - MongoDB 更新对象并删除属性?

javascript - 当文本/类不在 css 或样式标签中时,如何将 &lt;style&gt; 标签中的按钮与它对齐?

javascript - 使用单选按钮更改记录。

ruby-on-rails - 如何在 Ruby on Rails 环境中使用 Mongoid 进行通配符搜索?