我已经创建了一个将用户添加到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}`));
以下是我试图让部署的应用程序正常工作的方法:
- 我创建了一个
env_variables.yaml
并在其中添加了所需的连接变量,如下所示:
env_variables:
KEY = 'random-String-here'
DBUSER = 'mondodb-atlas-username'
DBPASSWD = 'mondodb-atlas-password'
DB = 'database name'
CLUSTER = '@cluster123.example'
- 在我拥有的
app.yaml
个人中:
includes:
- env_variables.yaml
runtime: nodejs20
- 然后我将
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
.任何帮助都将是非常可取的!