我希望你能帮助我(我们)。我正在开发一个有两个数据库的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;
}
如果您对如何实现这一点有任何想法(无论如何,我们仍然可以对我们的代码进行深层更改),我会很高兴听到它。
由于
答案 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());