如何从ZEIT Now上部署的应用程序连接到MongoDB数据库?

时间:2019-02-09 08:46:14

标签: node.js mongodb express mongoose zeit-now

我已经使用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没有显示任何错误。

1 个答案:

答案 0 :(得分: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。