从云功能创建单个mongodb/mongoose连接

2020-09-04 14:39发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我正在使用SAP Cloud Functions。 我的用例非常简单-用户调用该函数,该函数使用连接字符串连接到MongoDB Atlas(不支持SAP CP Mongo服务,因为尚不支持该功能),执行CRUD操作并返回结果。

我已经如下定义了我的云函数-index.js-

 const mongoose = require('mongoose');
   constAddress = require('./models/Address')
   module.exports = asyncfunction(事件,上下文)
   {
    const mongoConfig = context.getSecretValueJSON('mongodb','config.json');
    尝试{
    等待mongoose.connect(mongoConfig.config.uri,
    {useNewUrlParser:true,useCreateIndex:true});
    console.log("已连接到数据库")
    let address = new Address({" city":" Berlin"})
    等待地址.save()
    console.log("成功保存地址信息")
    退货地址;
    }捕获(错误){
    console.log("错误-" +错误)
    返回错误}
   };
  
 

相应的模式和模型在另一个文件-Address.js中定义

 const mongoose = require(" mongoose");

 const addressSchema = new mongoose.Schema({
     城市:{
         类型:字符串,
         必填:是,
         修剪:真
     }
 },{strict:false});

 const Address = mongoose.model('Address',addressSchema);

 module.exports =地址

现在的问题是,每次调用该函数时,猫鼬都会打开与数据库的新连接,在我看来这是一种非常低效的处理方式。 我想知道的是,如何组织代码以使连接仅发生一次(最好是在功能的初始部署期间)。

我尝试的是-在另一个名为connection.js的文件中定义连接详细信息-

 const mongoose = require('mongoose');

 mongoose.connect('mongodb:..........',{
     useNewUrlParser:true,
     useCreateIndex:true}); 

但是现在的问题是,我必须将连接详细信息硬编码在文件connection.js中。 在第一个代码段中,您将看到我使用了一个名为-

的属性。
 mongoConfig.config.uri 

此属性仅在函数内部通过变量 context 可用,该变量传递给cloud函数。 此变量从我们在部署期间定义的环境变量中选择连接详细信息。

我想利用环境变量而不是硬编码任何敏感信息。 同时确保连接- mongoose.connect()仅被调用一次,而不是每次调用该函数时都被调用。

所以,我有2个选项-

1。 访问main函数外部的context变量(在require语句之后),然后调用mongoose.connect(在main函数外部),从而对所有传入的函数调用重新使用mongoose连接。 或

2。 继续当前的实现,并将mongoose.connect放置在main函数中。 我现在可以使用上下文变量访问环境变量,但是将为每个新函数调用创建猫鼬连接。

谢谢

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我正在使用SAP Cloud Functions。 我的用例非常简单-用户调用该函数,该函数使用连接字符串连接到MongoDB Atlas(不支持SAP CP Mongo服务,因为尚不支持该功能),执行CRUD操作并返回结果。

我已经如下定义了我的云函数-index.js-

 const mongoose = require('mongoose');
   constAddress = require('./models/Address')
   module.exports = asyncfunction(事件,上下文)
   {
    const mongoConfig = context.getSecretValueJSON('mongodb','config.json');
    尝试{
    等待mongoose.connect(mongoConfig.config.uri,
    {useNewUrlParser:true,useCreateIndex:true});
    console.log("已连接到数据库")
    let address = new Address({" city":" Berlin"})
    等待地址.save()
    console.log("成功保存地址信息")
    退货地址;
    }捕获(错误){
    console.log("错误-" +错误)
    返回错误}
   };
  
 

相应的模式和模型在另一个文件-Address.js中定义

 const mongoose = require(" mongoose");

 const addressSchema = new mongoose.Schema({
     城市:{
         类型:字符串,
         必填:是,
         修剪:真
     }
 },{strict:false});

 const Address = mongoose.model('Address',addressSchema);

 module.exports =地址

现在的问题是,每次调用该函数时,猫鼬都会打开与数据库的新连接,在我看来这是一种非常低效的处理方式。 我想知道的是,如何组织代码以使连接仅发生一次(最好是在功能的初始部署期间)。

我尝试的是-在另一个名为connection.js的文件中定义连接详细信息-

 const mongoose = require('mongoose');

 mongoose.connect('mongodb:..........',{
     useNewUrlParser:true,
     useCreateIndex:true}); 

但是现在的问题是,我必须将连接详细信息硬编码在文件connection.js中。 在第一个代码段中,您将看到我使用了一个名为-

的属性。
 mongoConfig.config.uri 

此属性仅在函数内部通过变量 context 可用,该变量传递给cloud函数。 此变量从我们在部署期间定义的环境变量中选择连接详细信息。

我想利用环境变量而不是硬编码任何敏感信息。 同时确保连接- mongoose.connect()仅被调用一次,而不是每次调用该函数时都被调用。

所以,我有2个选项-

1。 访问main函数外部的context变量(在require语句之后),然后调用mongoose.connect(在main函数外部),从而对所有传入的函数调用重新使用mongoose连接。 或

2。 继续当前的实现,并将mongoose.connect放置在main函数中。 我现在可以使用上下文变量访问环境变量,但是将为每个新函数调用创建猫鼬连接。

谢谢

付费偷看设置
发送
2条回答
宇峰Kouji
1楼-- · 2020-09-04 15:00

你好Boudhayan,

很好的问题! 我对此没有确切的答案,我会说这是更多意见。

FaaS背后的业务模型是,只有在执行函数时才需要付费。 这意味着,您的功能在某些时间间隔内可能根本不处于"活动"状态。 提供程序只会在您尝试访问它时"启动"您的功能。 例如。 由于可能会终止该功能,因此无法在多个请求之间保持连接打开。

如果您需要如此频繁地调用此函数,那么创建连接的开销将非常昂贵。 首先,您是否需要考虑FaaS。

Nir深蓝
2楼-- · 2020-09-04 14:43

您好, Boudhayan Dev

好。 我不确定FaaS如何作为afaik在后台运行,没有选择进入"更深层次"并且抽象程度降低的选项。 但这很有趣。

一周热门 更多>