Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法在Firebase函数中连接到MongoDB_Javascript_Node.js_Mongodb_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript 无法在Firebase函数中连接到MongoDB

Javascript 无法在Firebase函数中连接到MongoDB,javascript,node.js,mongodb,firebase,google-cloud-functions,Javascript,Node.js,Mongodb,Firebase,Google Cloud Functions,我使用Firebase函数作为MERN web app后端的主机。 当我在本地连接到MongoDB时,它可以工作,并且可以使用数据库运行操作。然而,当我部署到firebase函数时,它甚至无法连接到数据库 代码: index.js const functions = require('firebase-functions'); const server = require('./server.js'); exports.api = functions.runWith({ memory: "2GB

我使用Firebase函数作为MERN web app后端的主机。 当我在本地连接到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使用付费计划,出站网络应该可以


p、 这是我第一次在这里发帖。感谢您的时间,如果我违反了任何规则,我将提前道歉。

在云功能中监听端口不是有效的操作:

app.listen(PORT, console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.yellow.bold));
云函数使用分配给它的URL为您侦听,然后将请求传递给您的代码。当您将express应用程序传递到
onRequest()
时,所有这些都为您准备好了


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

在云功能中监听端口不是有效的操作:

app.listen(PORT, console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.yellow.bold));
云函数使用分配给它的URL为您侦听,然后将请求传递给您的代码。当您将express应用程序传递到
onRequest()
时,所有这些都为您准备好了


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

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

因此,您根本无法在Firebase功能中承载具有预期持久连接的完整express应用程序。


更多信息,在此

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

因此,您根本无法在Firebase功能中承载具有预期持久连接的完整express应用程序。


在此

中介绍更多信息,谢谢您的回答。但这是否意味着不可能在GCF中安装express应用程序?或者简单地删除行就可以了?不,文档中很清楚express应用程序是一个有效的参数。由于隐含的中间件,它可能不会按照您想要的方式运行。抱歉,我想问的是,是否可以将MERN app放入GCF,也就是说,我是否可以连接到server.js中的mongodb并将其用于api,或者我是否必须在每个api函数中都连接到mongodb,以便每次调用api时,它都会为我重新连接。再次感谢您抽出时间。e、 g.createUser://connect to db first//do stuff//close connection如果您的应用程序尚未从上一次调用连接,则应该连接。感谢您的回答。但这是否意味着不可能在GCF中安装express应用程序?或者简单地删除行就可以了?不,文档中很清楚express应用程序是一个有效的参数。由于隐含的中间件,它可能不会按照您想要的方式运行。抱歉,我想问的是,是否可以将MERN app放入GCF,也就是说,我是否可以连接到server.js中的mongodb并将其用于api,或者我是否必须在每个api函数中都连接到mongodb,以便每次调用api时,它都会为我重新连接。再次感谢您抽出时间。e、 g.createUser://connect to db first//do stuff//close connection如果尚未从上一次调用连接,则您的应用程序应该连接。有什么替代方法?在每次请求时重新连接到数据库?是的,您可以阅读更多关于此的内容。有什么替代方案?在每次请求时重新连接到DB?是的,您可以阅读更多关于此的内容。