连接 Mongoose 和 AWS Lambda 函数

Jen*_*nny 1 mongoose aws-lambda

我想将 lambda 函数与 Netlify 和 Mongoose 一起使用。基本上触发前端的函数并更新数据库。

const mongoose = require('mongoose')

let uri = 'mongodb+srv://...flashcard?retryWrites=true&w=majority'

let client = mongoose.connect(`${uri}`, {
  useNewUrlParser: true
}
);

const clientPromise = client.connect()

exports.handler = async (event, context, callback) => {
 
  context.callbackWaitsForEmptyEventLoop = false;
  
  try {    
 
    client = await clientPromise;
    client.db('flashcards').createCollection('hello')

    return {
      statusCode: 200,
    };
  } catch (err) {
    return {
      statusCode: 500,
      body: JSON.stringify({ msg: err.message }) 
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用并返回

500 Internal Server Error Cannot read properties of undefined (reading 'connect')
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 MongoClient 执行此操作并仅更改第一部分,它就会工作并更新数据库。


const { MongoClient } = require('mongodb');


let uri = 'mongodb+srv://...flashcard?retryWrites=true&w=majority'
let client = new MongoClient(`${uri}`, {
  useNewUrlParser: true
}
);
Run Code Online (Sandbox Code Playgroud)

我怎样才能用猫鼬做到这一点?谢谢阅读!

我从以下位置获取了工作示例

https://www.mongodb.com/docs/atlas/manage-connections-aws-lambda/
Run Code Online (Sandbox Code Playgroud)

Jur*_*rek 5

我就是这样做的。我使用了 React.js 并在 Netlify 上部署了简单的网站来检查他们的无服务器功能如何工作。在这个例子中,我只是从表单发送电子邮件并将其数据保存在 mongo atlas 数据库中,我使用 mongoose。

  1. 准备 altas mongo url 以连接到他们的数据库。您需要在 netlify 网站上、已部署项目的设置中添加环境变量,或者您可以在部署之前执行此操作。
  2. 在项目的根目录中:
  • 创建文件夹 db > conntectDb.js 文件

  • 在 connectDb.js 文件中

      const mongoose = require('mongoose');
      const connectDb = async (url) => {
    
       //Here you can observe that url of mongo atlas will show once
       //Check this in netlify functions panel after you deploy your page
       //Observe it when you send form using url netlify function
      console.log(url, 'url to mongo atlas, connectDb');
    
       await mongoose.connect(url);
      };
    
      module.exports = connectDb;
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建文件夹 models > email.js 文件

  • 在 email.js 文件中创建电子邮件架构

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    const emailSchema = new Schema({
     name: {
      type: String,
      required: true,
     },
     email: {
      type: String,
      required: true,
     },
     message: {
      type: String,
      required: true,
     },
    });
    
    module.exports = mongoose.model('Email', emailSchema);
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建文件夹 netlify > 文件夹功能 > email.js 文件

  • 这里保留netlify函数

  • 有关向项目添加 netlify 函数时文件夹结构的信息,您可以在此处找到:https ://docs.netlify.com/functions/build-with-javascript/

  • 在 email.js 文件中

    const mongoose = require('mongoose');
    const connectDb = require('../../db/connectDb');
    const Email = require('../../models/email');
    
    connectDb(process.env.REACT_APP_DB);
    //Make connection with mongoose to mongo atlas outside handler
    
    exports.handler = async function (event) {
     //Observe state connection for mongoose in
     //Netlify functions panel on their website when you deploy your   page
     console.log(mongoose.connection.readyState, 'Ready state email');
     const body = JSON.parse(event.body);
     const newEmail = await Email.create(body);
    
     return{
      statusCode: 200,
      body: JSON.stringify({ value: newEmail }),
     };
    };
    
    Run Code Online (Sandbox Code Playgroud)

注意:我在函数处理程序之外添加了连接 mongoose (connectDb)。

在您的组件中进行反应(在本例中我使用反应):

  • 创建包含姓名、电子邮件、消息输入的表单
  • 例如使用 fetch api 发送请求
  • 发送 POST http 请求
  • 使用此 url const url = '/.netlify/functions/email';
  • 如果您在本例中遵循我的文件夹结构

就这样。我希望这对你有帮助。