在MongoDB中使用Azure Function App中的持久函数 [英] Using durable functions in azure function app with mongodb

查看:76
本文介绍了在MongoDB中使用Azure Function App中的持久函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个mongoDB,其中包含我的持久功能应运行的时间(例如8:00、9:01、10:20).现在,我的Orchestrator代码在下面,在mongoClient.connect内部没有任何作用.为什么?

I have a mongoDB which contains the time where in my durable function should run (e.g. 8:00, 9:01, 10:20). Now I have my Orchestrator code below, nothing works inside the mongoClient.connect. Why???

const df = require("durable-functions");
const moment = require("moment");
const mongoClient = require("mongodb").MongoClient;

module.exports = df.orchestrator(function*(context) {
    context.log("Getting time schedules in DB");
    var timeSched = [];
    var dbName = <dbName>;
    var collectionName = <collectionName>;

    var query = {id: "1"};
    try{
        mongoClient.connect(<mongoDB_connection_string>,{useNewUrlParser: true, authSource: dbName}, function (err, client) {
//Anything inside this does not log or work
            if(err){
                context.log(`Error occurred while connecting to DB ${err}`)
                return context.done();
            }else{
                context.log('MongoClient connected to DB');
            }
            var collection = client.db(dbName).collection(collectionName);
            collection.find(query).toArray(function(err, result) {
                if (err) throw err;
                for(let i = 0; i < result.length; i++){
                    timeSched.push(result[i].time); //e.g.8:00
                }
                client.close();
//This should log [8:00,9:01,10:01] but it does not log
                context.log(timeSched);
                context.done();
            });
        });
//This logs 0
        context.log(timeSched.length);
        for (let j = 0; j < timeSched.length; j++) {
            const deadline = moment.utc(context.df.currentUtcDateTime).add(3, 'minutes');
            yield context.df.createTimer(deadline.toDate());
            yield context.df.callActivity("ActivityFunction",timeSched[j]);
        }
        context.done();
    }catch(e){
        context.log(`Error ${e}`);
        context.done();
    }
});

推荐答案

尝试下面的代码检查是否可以首先连接到数据库.使用console.log而不是context.log.

Try the code below to check if you can connect to DB first. Use console.log instead of context.log.

const df = require("durable-functions");
const mongoClient = require("mongodb").MongoClient;
module.exports = df.orchestrator(function*(context) {
  var mongoClient = require("mongodb").MongoClient;
  mongoClient.connect(
    "mongodb://tonytest:78jst6Mh****.documents.azure.com:10255/?ssl=true",
    function(err, client) {
      if (err) {
        console.log(`Error occurred while connecting to DB ${err}`);
        return context.done();
      } else {
        console.log("MongoClient connected to DB");
      }
      client.close();
    }
  );
});

尝试使用console.log(timeSched);输出timeSched.此外,当您执行console.log(timeSched.length);时,尚未授予timeSched值.这就是为什么你得到0;

Try with console.log(timeSched); to output timeSched. Besides, when you execute console.log(timeSched.length);, timeSched hasn't been granted value. That's why you got 0;

这篇关于在MongoDB中使用Azure Function App中的持久函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆