如何使用Mongoose连接Lambda函数中的Mongo Atlas数据库

时间:2018-02-03 06:32:20

标签: javascript mongodb mongoose lambda serverless-framework

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

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

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

现在,当我在localhost上测试时,它完美无缺。但是当我部署到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();
          });
    });
};

1 个答案:

答案 0 :(得分:1)

经过两周的坚持之后,我了解到我需要在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}