无法在Firebase函数中连接到MongoDB



我使用Firebase函数作为MERN web应用后端的主机。当我在本地连接到MongoDB时,它可以工作,并且可以使用数据库运行操作。然而,当我部署到firebase函数时,它甚至无法连接到数据库。

代码:

index.js

const functions = require('firebase-functions');
const server = require('./server.js');
exports.api = functions.runWith({ memory: "2GB", timeoutSeconds: 120 }).https.onRequest(server);

server.js 的一部分

const express = require("express");
const dotenv = require("dotenv");
const colors = require("colors");
const morgan = require("morgan");
const path = require("path");
const cors = require("cors");
const bodyParser = require("body-parser");
const routes = require("./routes/routes.js");
const mongooseMethods = require("./database.js");
dotenv.config({ path: "./config/config.env" });
mongooseMethods.connectDB(process.env.MONGO_URL);
const PORT = process.env.PORT || 8080;
// set up app
const app = express();
app.listen(PORT, console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.yellow.bold));
app.use(cors({ origin: true }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(morgan("dev"));
app.use("/api", routes); // /api routes
module.exports = app;

routes.js

const express = require("express");
const app = express.Router();
const testingApi = require('../controller/testing.js');
const authApi = require('../controller/auth.js');
// testing
app.get('/testing', testingApi.testing);
// user authentication
app.post('/user/register', authApi.createUser);
module.exports = app;

api/测试/也适用于

database.js

const mongoose = require("mongoose");
const mongooseMethods = {
connectDB: async (url) => {
try {
console.log("Connecting to MongoDB")
const connection = await mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true });
console.log(`MongoDB Connected: ${connection.connection.host}`.cyan.bold);
return connection;
} catch (error) {
console.log(`Error: ${error.message}, Exiting`.red.bold);
process.exit(1);
}
}
}
module.exports = mongooseMethods;

auth.js

const User = require('../model/user.model.js');
const bcrypt = require("bcryptjs");
let authenticationApi = {
createUser: async (req, res) => {
try {
console.log("Creating");
let newUser = new User({
...req.body
})
let result = await newUser.save();
return res.status(200).json({ result: result });
} catch (error) {
return res.status(400);
}
}
}
module.exports = authenticationApi;

我在向firebase发送请求时收到的错误是

2020-02-27T02:34:46.334044912Z D api: Function execution took 30970 ms, finished with status: 'connection error'

然而,它在当地运行得非常好。我也没有看到控制台日志"连接到MongoDB"。我猜database.js中出现的问题是,它一开始无法连接到mongo,但我不知道如何解决。

我在Firebase中使用付费计划,出站网络应该可以。

附言:这是我第一次在这里发帖。谢谢你抽出时间,如果我违反了任何规则,我会提前道歉。

在云函数中侦听端口不是有效操作:

app.listen(PORT, console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.yellow.bold));

Cloud函数使用分配给它的URL来侦听您,然后将请求传递给您的代码。当你把快递应用程序交给onRequest()时,一切都为你准备好了。

我建议从一个精简版的应用程序开始,只是为了获得关于事物如何工作的经验,然后在你感到舒适时添加更多。

发生这种情况的原因是Firebase函数的体系结构不是一个实际的服务器,而是一个类似于lambda的无服务器端点。由于它无法与数据库建立持久的连接,每次收到请求时都必须进行连接,因此数据库将此视为垃圾邮件,并关闭来自Firebase的进一步连接请求。

因此,您根本无法在Firebase函数中托管一个具有预期持久连接的完整express应用程序

更多关于这篇文章

最新更新