我已经创建了一个将用户添加到MongoDB的Express服务器.在本地主机上,它运行良好.然而,当我将其部署到Google Cloud时,它并没有向数据库中添加任何东西.因此,我认为我需要以不同的方式配置我的connection.js.以下是我使用的代码:

Connection.js:

const mongoose = require('mongoose');
require('dotenv').config({ path: __dirname + '/../../../.env' });

const dbURI = 'mongodb+srv://' + process.env.DBUSER + ':' + process.env.DBPASSWD + process.env.CLUSTER + '.mongodb.net/' +
    process.env.DB + '?retryWrites=true&w=majority';

const dbOptions = {
    useNewUrlParser: true,
    useUnifiedTopology: true
}

const connectToDatabase = async () => {
    mongoose.connect(dbURI, dbOptions)
        .then(result => console.log("Database connected"))
        .catch(error => console.log(error));
};

module.exports = connectToDatabase;

Index.js:

const express = require('express');
const exphbs = require('express-handlebars');
const mongoose = require('mongoose');
const handlebars = require("handlebars");
const connectToDatabase = require('./Connection/dbConnection.js');
require('dotenv').config({ path: __dirname + '/./../../.env' })

connectToDatabase();

const app = express();

// Middlewares
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static('public'));

app.use('', require('./routes/routes.js'));

app.engine('handlebars', exphbs.engine({
    defaultLayout: 'main'
}));
app.set("view engine", "handlebars");

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`App listening port ${PORT}`));

以下是我试图让部署的应用程序正常工作的方法:

  1. 我创建了一个env_variables.yaml并在其中添加了所需的连接变量,如下所示:
env_variables:
  KEY = 'random-String-here'
  DBUSER = 'mondodb-atlas-username'
  DBPASSWD = 'mondodb-atlas-password'
  DB = 'database name'
  CLUSTER = '@cluster123.example'
  1. 在我拥有的app.yaml个人中:
includes:
  - env_variables.yaml

runtime: nodejs20
  1. 然后我将connection.js修改为:
const mongoose = require('mongoose');
const fs = require('fs');

// Check if the app is deployed by looking for a deployment-specific environment variable
const isDeployed = process.env.DEPLOYED === 'true';

// Function to load environment variables
const loadEnvVariables = () => {
  if (isDeployed) {
    // Use env_variables.yaml when deployed
    const yaml = require('js-yaml');
    const envVarsYaml = fs.readFileSync('env_variables.yaml', 'utf8');
    const envVars = yaml.safeLoad(envVarsYaml);
    return envVars;
  } else {
    // Use .env when running locally
    require('dotenv').config({ path: __dirname + '/../../../.env' });
    return process.env;
  }
};

const env = loadEnvVariables();

const dbURI = 'mongodb+srv://' + env.DBUSER + ':' + env.DBPASSWD + env.CLUSTER + '.mongodb.net/' +
    env.DB + '?retryWrites=true&w=majority';

const dbOptions = {
  useNewUrlParser: true,
  useUnifiedTopology: true
};

const connectToDatabase = async () => {
  mongoose.connect(dbURI, dbOptions)
    .then(result => console.log("Database connected"))
    .catch(error => console.log(error));
};

module.exports = connectToDatabase;

当然,这个解决方案并不奏效.每次try 添加用户时,我都会得到Server side error creating a user,即使我显式使用了dbURI中的环境变量值.所以我想知道我需要做什么,以便如果我在开发中工作,代码使用dotevn文件,如果应用程序被部署,它使用env_variable文件连接到数据库.但也许生产和开发的验证是不需要的,因为mongoDB Atlas是在线托管的?

第一次部署应用程序,第一次使用Google Cloud.任何帮助都将是非常可取的!

推荐答案

通过将App Engine的出站IP地址以及OP的其他IP添加到MongoDB Atlas的IP访问列表中,可以解决该问题.MongoDB Atlas的一个安全功能是只允许来自项目IP访问列表中的条目的连接.

参考资料:

Node.js相关问答推荐

如何在Firebase Cloud Function v2计划函数中设置代码中的时区?

我的Node.js应用程序没有将Mongoose方法findByIdAndDelete作为函数进行检测

npm错误;无法解析依赖项:npm ERR!对等webpack@;5.x.x;来自@webpack-cli/serve@2.0.5";

在函数上执行 toString 的Typescript 会产生奇怪的字符 (path_1, (0, Promise.writeFile))

从mongodb集合中获取每分钟数据的每小时数据

尽管 tsconfig 中提供了正确的路径,但仍出现找不到模块错误

合并Shift对象数组以创建最终的排班表

如何在 Firestore 函数上使用类型模型来获取字段值

我正在try 在公共目录中使用 Express.js 项目部署 Angular 静态构建

我误解了外键的工作原理吗?使用续集

如何解决未调用 Express 错误处理程序的问题

如何从动态Typescript 文件加载模块

在express js模型中将js转换为Typescript 时Typescript 错误

为什么需要在 NodeJS 应用程序中创建服务器?

Aptana Studio 是否有 NodeJS 插件?

使用 WebSockets 有服务器成本吗?

如何将使用 Gulp 的 node 部署到 heroku

ISODate 未定义

yarn 和 npm 的主要区别是什么?

Mongoose - 验证邮箱语法