更改运行时使用的连接

时间:2015-03-06 08:17:18

标签: node.js sails.js

我希望你能帮助我(我们)。我正在开发一个有两个数据库的API项目:

Production DB : api.myapp.fr

Testing DB : test.api.myapp.fr

这两个数据库是用户可写的。

当用户调用我们的API时,他可以根据需要设置授权标头。例如:

Authorization: s_0

将对api.myapp.fr

执行操作

Authorization: s_t_0

将对test.api.myapp.fr执行操作。

我的问题是:我怎么能用风帆做到这一点?

实际上,我有一个检查用户是否正在使用生产密钥或测试密钥的策略,并且我将覆盖默认模型用于测试目的,如下所示:

if (!is_production) {
    req.session.isProd = false;
    req.session.logs.environment = "test";

    User = UserTest;
    Payment = PaymentTest;
    PayzenStatus = PayzenStatusTest;
    Transaction = TransactionTest;
    Card = CardTest;
    Doc = DocTest;
}

但是如果用户发出测试请求然后是生产请求,您可以看到问题,模型仍然是测试模型......

我在服务和政策中使用我的模型,因此我无法做到

req.models = {};
// If not in production, use the test models
if (!is_production) {
    req.session.isProd = false;
    req.session.logs.environment = "test";

    req.models.User = UserTest;
    req.models.Payment = PaymentTest;
    req.models.PayzenStatus = PayzenStatusTest;
    req.models.Transaction = TransactionTest;
    req.models.Card = CardTest;
    req.models.Doc = DocTest;
}
// Otherwise use the production models
 else {
    req.models.User = User;
    req.models.Payment = Payment;
    req.models.PayzenStatus = PayzenStatus;
    req.models.Transaction = Transaction;
    req.models.Card = Card;
    req.models.Doc = Doc;
}

如果您对如何实现这一点有任何想法(无论如何,我们仍然可以对我们的代码进行深层更改),我会很高兴听到它。

由于

1 个答案:

答案 0 :(得分:0)

两种不同的方式。

首先,您可以在生产主机上设置环境变量,并检查该环境变量以查看您是否在prod中运行。如果您在prod中运行,则使用URI到生产数据库。

Secodonly,这可能是更好的方法,可以创建一个允许您读取环境变量的config.js文件。我为我的所有应用程序做的是为数据库和API密钥设置连接信息的环境变量。在本地运行/测试时,我的应用程序中有一些默认设置,但是当设置环境变量时,它们会被读取和使用。因此,将生产中的环境变量设置为指向生产数据库。

下面发布的config.js文件包含对VCAP的引用,假设您在Cloud Foundry上运行。

config.js

var VCAP_SERVICES = process.env["VCAP_SERVICES"],
    vcapServices;

if (VCAP_SERVICES) {
    vcapServices = JSON.parse(VCAP_SERVICES);
}

function getEnv(propName, defaultValue) {
    if (process.env[propName]) {
        return process.env[propName];
    } else {
        return defaultValue;
    }
}

module.exports = function() {
    return {
        getEnv : getEnv,
        couchDbURL: function() {
            // Default to a local couch installation for development
            if (VCAP_SERVICES) {
                return vcapServices["cloudantNoSQLDB"][0].credentials.url;
            }
            else {
                return "http://localhost:5984";
            }
        },
        couchDbName: function() {
            return getEnv("COUCHDB_NAME", "mydb");
        }
    };
};

app.js

var config = require("./config")();
console.log(config.couchDbURL());