mongodb 在AWS lambda和无服务器环境中使用mongoose时管理和缓存连接

zvms9eto  于 2023-06-22  发布在  Go
关注(0)|答案(1)|浏览(114)

我已经使用无服务器在AWS lambda中部署了一个后端应用程序(Node Js/Express)。
在db.js中

const mongoose = require('mongoose')

mongoose.connect(process.env.MONGODBURL , {
    useNewUrlParser : true
})

在app.js中

const express = require('express')
require('./db/db')

const app = express()

// ...Rest code goes here

在handler.js中

'use strict';
const app = require('./app')
const serverless = require('serverless-http')

module.exports.hello = serverless(app)

这就是我的代码结构。但是如何在这种类型的代码结构中管理和缓存monogoose连接,以便lambda不会在每次调用时创建新的连接。
我尝试在使用AWS lambda时阅读Mongoose连接指南。但是我无法跟上这种代码结构

hyrbngr7

hyrbngr71#

使用此代码更新您的db.js。然后在要进行连接的位置调用dbConnect()。根据aws,我认为它应该在你的处理程序导出语句之外。但是因为我们在这里重用现有的连接,我不明白为什么我们不能在每个进行数据库调用的文件中调用dbConnect(),以防现有的连接过时。请留下评论,如果它在您的情况下工作,或面对任何其他问题。

const mongoose = require('mongoose')

const MONGO_URI = process.env.MONGO_URI

if (!MONGO_URI) {
  throw new Error(
    'Please define the MONGO_URI environment variable!!'
  )
}

let cached = global.mongoose

const dbConnect = async () => {
  if (cached && cached.conn && cached.conn.readyState === 1) {
    return cached.conn
  }
  // Close the existing connection if it exist but is stale.
  if (cached && cached.conn) {
    await cached.conn.close()
  }

  const opts = {
    //bufferCommands: false,
    // useNewUrlParser: true, 
    //basically add the required options here.
  }

  cached.conn = await mongoose.connect(MONGO_URI, opts)
    .then(() => {
      console.log('Database connected!')
      return mongoose.connection
    })
    .catch(error => {
      console.log('Failed to connect to the database:', error)
      throw error
    })

  return cached.conn
};

module.exports = dbConnect

相关问题