【发布时间】:2020-04-12 09:17:15
【问题描述】:
今天我试图找到一种方法来分离模式之间的全局变量:prod 和 dev。
我已经使用第三方模块“dotenv”在“process.env”中隐藏了敏感信息,但无论我处于开发模式还是生产模式,在那里拥有适当的信息仍然会很舒服。例如,如果我在本地工作,我正在使用本地或云测试数据库,当我处于 prod 模式时,我希望拥有真正的数据库的适当凭据。因此它会根据当前模式自动切换。
您可以在下面看到我到目前为止的想法。对于结构问题或实践、经验的任何建议或建议,我将不胜感激。
提前感谢您!
server.js
import { environment } from "./environment";
import { apiExplorer } from "./graphql";
import express from "express";
import { ApolloServer } from "apollo-server-express";
import { database } from "./utils/database";
import { logger } from "./utils/logging";
import { verify } from "./utils/jwt";
database.connect();
apiExplorer.getSchema().then((schema) => {
// Configure express
const port = environment.port;
const app = express();
// Configure apollo
const apolloServer = new ApolloServer({
schema,
context: ({ req, res }) => {
const context = [];
// verify jwt token
context.authUser = verify(req, res);
return context;
},
formatError: (error) => {
logger.error(error);
return error;
},
debug: true
});
apolloServer.applyMiddleware({ app });
app.listen({ port }, () => {
logger.info(`????Server ready at http://localhost:${port}${apolloServer.graphqlPath}`);
});
})
.catch((err) => {
logger.error('Failed to load api', err);
})
数据库类
import mongoose from 'mongoose';
import { environment } from "../environment";
import { logger } from './logging';
class Database {
constructor() {
this._database = 'MongoDB';
this._username = environment.db.username;
this._password = environment.db.password;
this._dbName = environment.db.name;
}
connect() {
mongoose.Promise = global.Promise;
const url = `mongodb+srv://${this._username}:${this._password}@cocoondb-qx9lu.mongodb.net/${this._dbName}?retryWrites=true&w=majority`;
try {
mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true });
mongoose.connection.once('open', () => logger.info(`Connected to ${this._database}`));
mongoose.connection.on('error', err => logger.error(err));
} catch (e) {
logger.error(`Something went wrong trying to connect to the database: ${this._database}`)
}
}
}
export const database = new Database();
环境/index.js
import { development } from './develepment';
import { production } from './production';
import { merge } from "lodash"
const mode = process.env.NODE_ENV ? 'production' : 'development';
const values = process.env.NODE_ENV ? production : development;
export const environment = merge(values, { mode });
开发.js
import dotenv from 'dotenv';
dotenv.config();
export const development = {
port: 8080,
db: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
name: process.env.DB_NAME
}
};
生产.js
import dotenv from 'dotenv';
dotenv.config();
export const production = {
port: process.env.PORT,
newfromproduction: 'jkdl',
db: {
test: 'test'
}
};
file structure
src
-environment
- index.js
- development.js
- production.js
-graphql
-models
-utils
server.js
.babelrc
.env
.gitignore
package.json
【问题讨论】:
标签: node.js express structure backend apollo-server