使用环境变量建立与数据库的连接

时间:2015-07-18 19:18:19

标签: mysql node.js express environment-variables node-mysql

我正在为我的应用创建一个API,从我的amazon数据库中获取一些数据。 我已将环境变量添加到服务器上profile.d中的custom.sh文件中。奇怪的是,我可以从我的api中打印出这些变量,但是创建连接时唯一有效的变量就是用户变量。

当我在连接字符串中对数据库凭据进行硬编码时,它可以正常工作。

这是我的custom.sh,其中我声明了环境变量

#custom environment variables, with the actual values removed
export DB_HOST=value1;
export DB_PASS=value2;
export DB_USER=value3;
export DB_NAME=value4;

这是我的nodejs expressjs api文件

var express = require('express');
var app = express();
var mysql = require('mysql');

var DB_HOST = formatEnvironmentVariable(process.env.DB_HOST);
var DB_USER = formatEnvironmentVariable(process.env.DB_USER);
var DB_PASS = formatEnvironmentVariable(process.env.DB_PASS);
var DB_NAME = "'"+process.env.DB_NAME+"'";
function formatEnvironmentVariable(env) {
  env = "'"+env+"'";
  return env 
} 
var pool = mysql.createPool({
  host     : DB_HOST,
  user : DB_USER,
  password : DB_PASS,
  database : DB_NAME,
  connectionLimit: 100,
  debug: false
})
function QueryTheDatabase(req, res, querystring) {
  pool.getConnection(function(err,connection){
          if (err) {

            connection.release();
            res.json({"code" : 100, "status" : "Error in connection database"});
            return;
          }   

          console.log('connected as id ' + connection.threadId);
          connection.query(querystring,function(err,rows){
              connection.release();
              console.log("error? "+err);
              if(!err) {
                  res.json(rows);
              }           
          });
          connection.on('error', function(err) {
            console.log("error");   
                res.json({"code" : 100, "status" : "Error in connection database"});
                return;     
          });
  });
}

app.get('theurl', function(req, res) {
  QueryTheDatabase(req, res, "the query that works fine");
});
var server = app.listen(3000, function () {
var host = server.address().address;
var host = server.address().port;
});

3 个答案:

答案 0 :(得分:0)

我不确定为什么只有DB_USER变量设置正确(可能是某些其他进程正在发送该信息)。如果您正在运行shell脚本:

$ ./custom.sh

它不会起作用。它本质上是创建一个子shell,导出的变量是该shell的本地变量(它们不会影响父级)

使节点进程可以访问环境变量的唯一方法是首先获取文件。

$ source ./custom.sh

答案 1 :(得分:0)

我终于开始工作,结果我不需要添加''我的格式化功能。

而不是

import java.util.concurrent.*;

public class URLConnectionReader {
  public static void main(String... args) {
    NewsTask task = new NewsTask();

    ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
    service.scheduleAtFixedRate(task, 0L, 20L, TimeUnit.SECONDS);
  }
}

我写了

var DB_HOST = formatEnvironmentVariable(process.env.DB_HOST);
var DB_USER = formatEnvironmentVariable(process.env.DB_USER);
var DB_PASS = formatEnvironmentVariable(process.env.DB_PASS);
var DB_NAME = "'"+process.env.DB_NAME+"'";

答案 2 :(得分:0)

为此,我建议使用

      config npm

https://www.npmjs.com/package/config