Асинхронные запросы в Node js и mongo - PullRequest
0 голосов
/ 04 ноября 2019

объявление глобальное

 let veh = {
            data: []
        }

Основано на моей серии асинхронных операций ниже. Во-первых, я получаю данные из vehicle.model, а затем присваиваю veh.data = vehicle (что является результатом), а затем использую идентификатор транспортного средства для запроса сборов. Теперь результат, который я получил из коллекций, я хотел добавить или добавить эти данные в veh.data, поэтому во втором запросе вы можете увидеть строку

   if (finalFile) {

                                                veh.data[i].FileData = finalFile

                                            }

, но когда я проверяю окончательный результат, FileData не былдобавлено. Любая проблема с асинхронными запросами?

Первый запрос в асинхронной серии (результат veh.data = vehicle)

async.series([
        function (next) {

            Vehicle.model.count({}, function (err, totalCount) {
                if (err) {
                    response = { "error": true, "message": "Error fetching data" }
                }

                Vehicle.model.find(query, {}, pagination).sort(sortOrd + sortType).exec(function (err, vehicle) {
                    if (err || !vehicle) {
                        res.json({
                            message: err
                        })
                    }

                    var totalPages = Math.ceil(totalCount / size)
                    if (vehicle) {
                        veh.data = vehicle
                    }
                    return next();

                })

            })

        },

Второй запрос

}, функция (далее) {

    MongoClient.connect(url, function (err, client) {

        if (err) {
            return res.render('index',
                {
                    title: 'Uploaded Error',
                    message: 'MongoClient Connection error', error: err.errMsg
                });
        }

        const db = client.db(dbName);
        const collection = db.collection('fs.files');
        const collectionChunks = db.collection('fs.chunks');

        for (let i = 0; i < veh.data.length; i++) {

            let ImageList = veh.data[i].ImageList.split(',')
            let profile_name = ImageList[0].split('/').pop();

            collection.find({
                $and: [
                    { $or: [{ metadata: veh.data[i].VIN }] },
                    { $or: [{ filename: profile_name }] }
                ]
            }).toArray(function (err, docs) {
                if (err) {
                    return res.render('index', {
                        title: 'File error',
                        message: 'Error finding file',
                        error: err.errMsg
                    });
                }
                if (!docs || docs.length === 0) {
                    return res.render('index', {
                        title: 'Download Error',
                        message: 'No file found'
                    });
                } else {

                    for (let i = 0; i < docs.length; i++) {

                        collectionChunks.find({ files_id: docs[i]._id })
                            .toArray(function (err, chunks) {
                                if (err) {
                                    return res.render('index', {
                                        title: 'Download Error',
                                        message: 'Error retrieving chunks',
                                        error: err.errmsg
                                    });
                                }
                                if (!chunks || chunks.length === 0) {
                                    return res.render('index', {
                                        title: 'Download Error',
                                        message: 'No data found'
                                    });
                                }

                                let fileData = []

                                for (let i = 0; i < chunks.length; i++) {
                                    fileData.push(chunks[i].data.toString('base64'));
                                }

                                let finalFile = 'data:' + docs[0].contentType + ';base64,'
                                    + fileData.join('');

                                if (finalFile) {

                                    veh.data[i].FileData = finalFile

                                }


                            });

                    }

                    console.log("Resulta1 :" , veh.data)

                }




            })


        }


        return next();

    })

FileData существует, когда я назначил его для второго запроса в серии, но когда я проверяю veh.data в третьем FileData не был добавлен.

The Third

}, function (next) {

    return res.status(200).send({
        message: "success",
        pageNo: pageNo,
        totalRecords: veh.data.length,
        data: veh.data,
        // totalPages: totalPages

    })


}

Почему эти FileData не были добавлены к конечному результату каждого объекта в массиве объектов, который является veh.data? который находится на третьей функции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...