0

我已经使用 ExpressJS 在 Zeit Now 上部署了一个应用程序。该应用程序使用 Mongoose 与 MongoDB 建立连接。但是,我使用的连接状态mongoose.connection.readyState显示为 2,表示“正在连接”。

我尝试在本地运行应用程序,它工作正常,我可以在其中写入数据库。

const connectionURL = "mongodb+srv://MONGODB_USERNAME:MONGOD_BPASSWORD@cluster1-23abc.mongodb.net/DATABASE_NAME?retryWrites=true"

expressApp.listen(3000, function() {
  console.log("Listening to port 3000");
});

mongoose
  .connect(
    connectionURL, { useNewUrlParser: true }
  )
  .then(function() {
    console.log("db connected!");
  });

expressApp.get("/", function(req, res) {
  res.write(`Connection State:  ${mongoose.connection.readyState}\n`);
  res.end();
});

我希望mongoose.connection.readyState为 1,表示“已连接”。但是,mongoose.connection.readyState卡在 2 处,表示“正在连接”。

此外,now logs不显示任何错误。

4

1 回答 1

0

您需要缓存 MongoDB 连接,这样您就不必在每次 lamda 调用时建立新连接。

您可以像我一样创建一个 lib 文件夹并清空 mongoose.js 文件 (lib/mongoose.js),并将此代码放入其中:

`import mongoose from 'mongoose';

let cachedDb = null;

console.log('outside-cachedDB:', cachedDb);
async function connectToDatabase(uri) {
  if (cachedDb) {
    console.log('=> using cached database instance');
    return cachedDb;
  }

  // If no connection is cached, create a new one
  const db = await mongoose.connect(uri, { useNewUrlParser: true });

  console.log('New MongoDB Connected');

  // Cache the database connection and return the connection
  cachedDb = db;
  return db;
}

export default async () => {
  await connectToDatabase(process.env.MONGODB_URI);
};`

然后在需要 mongoDB 连接的任何 lamda 中调用此自定义 mongoose 函数:

`import express from "express";
import mongoose from "../lib/mongoose";

const app = express();

// @route Get api/connect
// @desc Tests post route
// @access Public
app.get("*", async (req, res) => {
   await mongoose();
  // Code to query your DB or whatever here
});

export default app;`

当然,您不必使用 express,但我个人还没有转向更新的解决方案。其中一天我将学习 micro.js。

于 2019-06-22T03:49:43.237 回答