Неправильный результат возвращается в обратном вызове - PullRequest
0 голосов
/ 23 декабря 2018

Привет, я хочу объединить две коллекции и отправить объединенный результат.Я сделал следующее.Я использую монгоклиент.

> module.exports = function (context, req) {
> 
>     //making the connection
>     var response;
>     //check for the request method
> 
>     if (req.method !== 'GET') {
>         response = {
>             status: 500,
>             body: {
>                 "code": 500,
>                 "message": "Invalid request. Please check the request method or parameter"
>             },
>             headers: {
>                 'Content-Type': 'application/json'
>             }
>         }
>         context.done(null, response);
>         return;
>     } //end of if
> 
>     mongoClient.connect(dbUrl, function (err, client) {
>         assert.equal(null, err);
>         var database = client.db(databaseConfig.mLabDbName);
>         var response;
>         var getUserIdParams = req.query.userId
>         var index = req.query.index;
>         var noOfResults = mapResultsWithIndex(index)
> 
> 
>         getSubByUId(database, context, getUserIdParams, function (res, err) {
> 
>             // console.log("response from the callback", res)
> 
> 
>         getForms(database, context, res, function (result) {
>                 console.log("response from secondcallback", result)
> 
> 
>                 //closing the connection
>                 client.close();
> 
>                 if (err) {
>                     console.log("an error in getting the result");
>                     response = {
>                         status: 500,
>                         body: {
>                             code: 500,
>                             message: "Error in getting the forms"
>                         },
>                         headers: {
>                             'Content-Type': 'application/json'
>                         }
>                     }
>                 } //end of error
>                 else {
>                     if (result.length > 0) {
>                         console.log("got the data");
>                         response = {
>                             status: 200,
>                             body: {
>                                 code: 200,
>                                 result: result
>                             },
>                             headers: {
>                                 'Content-Type': 'application/json'
>                             }
>                         }
>                     } else {
>                         console.log("did not get the data");
>                         response = {
>                             status: 204,
>                             body: {
>                                 code: 204,
>                                 message: "No submissions found for the user id"
>                             },
>                             headers: {
>                                 'Content-Type': 'application/json'
>                             }
>                         }
>                     }
> 
>                 }
> 
>                  context.done(null, response)
>             })
>            
> 
>         }) //end of subId
> 
>     }) //closing mongodb connection }; //closing function
> 

Мои основные функции:

var getForms = function (db, context, array, callback) {
    let newArray = [];
    // console.log("array uuuuu", array)
    for (let i = 0; i < array.length; i++) {
        db.collection('forms').find({_id:ObjectID(array[i].formId)}).toArray(function (err, res) {
            console.log("rskkkk",res.length)
            res.forEach(doc => {
                newArray.push({
                    "subId": array[i]._id,
                    "formId": array[i].formId,
                    "userId": array[i].userId,
                    "formDescription": array[i].formDescription,
                    "formFields": array[i].formFields,
                    "createdAt": array[i].createdAt,
                    "data": array[i].data,
                    "imageformedarray": doc.imageUploadedarray
                })

            })
            callback(newArray);
            console.log("new array is", newArray.length);

        })


    }



}

var getSubByUId = function (db, context, getUserIdParams, callback) {
    let arr = [],
        type;
    var getSubmissions = db.collection('user-submission').find({
        userId: getUserIdParams
    });
    getSubmissions.toArray(function (err, res) {
        res.forEach(doc => {
            var value = doc.createdAt
            if (doc.hasOwnProperty("updatedAt")) {
                value = doc.updatedAt
            }
            if ((typeof (doc.formFields)) === "string") {
                console.log("string")
                type = JSON.parse(doc.formFields)
                // type = doc.data().formFields
            } else {
                type = doc.formFields
            }

            arr.push({
                "subId": doc._id,
                "formId": doc.formId,
                "userId": doc.userId,
                "formDescription": doc.formDescription,
                "formFields": type,
                "createdAt": value,
                "data": doc

            })
        });
        // console.log("arr is", arr);
        callback(arr, err)

    })

}

Я хочу вернуть весь массив, но он возвращает результат только в первом цикле.Когда я переместил этот обратный вызов getForms , где он присутствует, он возвращает результат с нулевым значением.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 23 декабря 2018

Вы запускаете обратный вызов для метода getForms, когда вы повторяете массив с циклом for.Это передает управление обратному вызову, который затем обрабатывает context.done для функции, которая всегда будет выводить первый элемент.

Как есть, этот код также приведет к множественным вызовам context.done, что должновызываться только один раз за выполнение функции.Имейте в виду, что определение для context.done context.done([err],[propertyBag]), которое ожидает объект в качестве вывода.

Для дальнейших ссылок проверьте: https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node

В дополнение к тому, что установлено functions.jsonпривязка вывода к:

{
  "type": "http",
  "direction": "out",
  "name": "$return"
}

Теперь, если вы переместите callback(newArray) за пределы for loop, вы должны увидеть ожидаемые результаты.

...