Node js和Mongo中的异步查询

时间:2019-11-04 03:37:37

标签: javascript node.js asynchronous

全局声明

 let veh = {
            data: []
        }

基于下面的异步系列。首先是我从vehicle.model获取数据,然后分配veh.data = vehicle(这是结果),然后使用车辆ID查询集合。现在我从集合中得到的结果是我想要将这些数据追加或添加到veh.data的,这就是为什么在第二个查询中可以看到一行

   if (finalFile) {

                                                veh.data[i].FileData = finalFile

                                            }

但是当我检查finalresult时,没有添加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时,它存在,但是当我检查第三个FileData中的veh.data时,就没有了。

第三次

},函数(下一个){

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

    })


}

为什么没有将FileData添加到veh.data对象数组中每个对象的最终结果中?哪个在第三个功能上?

0 个答案:

没有答案