gpt4 book ai didi

node.js - 更改运行时使用的连接

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:20 25 4
gpt4 key购买 nike

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

生产数据库:api.myapp.fr

测试数据库:test.api.myapp.fr

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

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

授权:s_0

将在 api.myapp.fr

上执行操作

授权:s_t_0

将在 test.api.myapp.fr 上执行操作。

我的问题是:我怎样才能用 sails 做到这一点?

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

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;
}

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

谢谢

最佳答案

执行此操作的两种不同方法。

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

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

我在下面发布的 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());

关于node.js - 更改运行时使用的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28894661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com