簡體   English   中英

如何使用無服務器在 Node js express 服務器中建立與 mongo db 的連接?

[英]How to establish connection to mongo db in a Node js express server using serverless?

我不知道如何使用 AWS 上的無服務器在 AWS Lambda 中為我的節點 JS 服務器建立與 mongo db 的連接。 我在下面的處理程序 function 中提到了我的問題。

代碼看起來像這樣:

import express from "express";
import mongoose from "mongoose";
import dotenv from "dotenv";   
import cookieParser from "cookie-parser";
import serverless from "serverless-http";

const PORT = 1234;

dotenv.config();

mongoose.connect(
    process.env.MONGO_URL,
    () => {
        console.log("connected to db");
    },
    (err) => {
        console.log({
            error: `Error connecting to db : ${err}`,
        });
    }
);

const app = express();

app.use(cookieParser());
app.use(express.json());

// this part has various routes
app.use("/api/auth", authRoutes);


app.use((err, req, res, next) => {
    const status = err.status || 500;
    const message = err.message || "Something went wrong";
    return res.status(status).json({
        success: false,
        status,
        message,
    });
});

app.listen(PORT, () => {
    console.log(`Server listening on port ${PORT}`);
});

export const handler = () => { 
    // how to connect to mongodb here?
    return serverless(app);
};

這里的handler是 AWS lambda 的處理程序 function。 對於每個 http 請求,我正在以某種方式從/向我的數據庫讀取/寫入數據。 查看cloudwatch日志后,很明顯發送到服務器的請求導致超時,因為與mongodb的連接尚未建立。 那么我究竟如何在這里使用mongoose.connect呢?

我試過這樣做:

export const handler = () => { 
    mongoose.connect(
        process.env.MONGO_URL,
        () => {
            console.log("connected to db");
        }
    );
    return serverless(app);
};

但它可能不起作用,因為它是異步的。 所以我不確定如何在這里建立這種聯系。

編輯

我意識到的一件事是數據庫服務器的網絡訪問列表只有我的 IP,因為這就是我最初設置它的方式。

所以我現在把它改成了任何地方,並做了以下小改動:

const connect_to_db = () => {
    mongoose
        .connect(process.env.MONGO_URL)
        .then(() => {
            console.log("Connected to DB");
        })
        .catch((err) => {
            throw err;
        });
};

app.listen(PORT, () => {
    connect_to_db();
    console.log(`Server listening on port ${PORT}`);
});

現在我可以在日志中看到“已連接到數據庫”,但發送的請求在 15 秒后仍然超時(當前設置的超時限制)。

我的日志:

在此處輸入圖像描述

我究竟做錯了什么?

所以我做了一些更多的挖掘,並在社區周圍詢問了這個問題。 幾件事讓我明白我做錯了什么:

  • 看來我沒有數據庫和我的應用程序響應連接在一起。 我的應用程序處理請求很好,我的數據庫連接正常。 但是沒有什么能把他們綁在一起。 它應該很簡單:

    請求進入 > 應用程序等待數據庫連接建立 > 應用程序處理請求 > 應用程序返回響應。

  • 其次,調用 app.listen 是我代碼中的另一個問題。 調用 listen 保持進程對傳入請求保持打開狀態,最終在超時時被 Lambda 殺死。

    在無服務器環境中,您不會啟動偵聽請求的進程,而是由 AWS API 網關(我曾經讓我的 Lambda 處理 Z80791B3AE7002CB88C246876D9FAA8F 請求信息)完成偵聽部分並知道它向請求發送信息Lambda 處理程序,用於處理和返回響應。 處理程序 function 設計為在每個請求上運行並返回響應。

所以我嘗試添加await mongoose.connect(process.env.MONGO_URL); 在對數據庫進行任何操作之前,我的所有方法都開始按預期發送響應。 這變得重復了,所以我創建了一個簡單的中間件,這幫助我避免了很多重復的代碼。

app.use(async (req, res, next) => {
    try {
        await mongoose.connect(process.env.MONGO_URL);
        console.log("CONNECTED TO DB SUCCESSFULLY");
        next();
    } catch (err) {
        next(err);
    }
});

另一個重要但很小的變化。 我錯誤地分配了 lambda 的handler

而不是這個:

export const handler = () => { 
    return serverless(app);
};

我這樣做了:

export const handler = serverless(app);

我想就是這樣,這些更改將我的快遞服務器固定在 Lambda 上。 如果我所說的任何內容有任何錯誤,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM