Как сделать маршрут синхронным - PullRequest
0 голосов
/ 18 января 2019

У меня есть маршрут к комментариям, где я хочу получить все комментарии для определенного регистра №. Опять же, для каждого комментария может быть несколько файлов. Я хочу получить их все синхронно, тогда как с nodeJS по умолчанию он работает асинхронно. Комментарии и файлы хранятся в разных коллекциях.

Это маршрут, по которому я хочу вернуть результат как один объект JS

router.get("/history/:docket_no", (req, res) => {
    Comments.find({ docket_no: req.params.docket_no })
    .exec()
    .then(comments => {
        var cmnts = [];
        if (comments.length >= 1) {
            for(var i = 0; i < comments.length; i++) {
                var cmntImgs = [];
                CommentImage.find({ comment_id: comments[i]._id })
                .exec()
                .then(commentImages => {
                    for(var j = 0; j < commentImages.length; j++) {
                        var filePath = commentImages[j].comment_image;
                        var fileName = filePath.split("\\");
                        cmntImgs[j] = {
                            filesName: fileName[fileName.length-1],
                            filePath: filePath
                        };
                    }
                    console.log('Images',cmntImgs);
                })
                .catch(err => {
                    console.error(err);
                });

                cmnts[i] = {
                    id: comments[i]._id,
                    user_name: comments[i].user_name,
                    role_id: comments[i].role_id,
                    message: comments[i].message,
                    create_date: comments[i].create_date,
                    files: cmntImgs
                };
            };

            return res.status(200).json({
                comments: cmnts
            });

        } else {
            return res.status(400).json({
                msg: "No comments found"
            });
        }
    })
    .catch(err => {
        console.error(err);
        res.send(500).json({
          msg: "Error"
        });
    });
});

Это схема комментариев ...

const mongoose = require("mongoose");

//Comments Schema
const CommentsSchema = mongoose.Schema({
    docket_no: {
        type: String,
        trim: true,
        required: true
    },
    user_name: {
        type: String,
        required: true
    },
    role_id: {
        type: Number,
        required: true
    },
    message: {
        type: String,
        trim: true,
        required: true
    },
    create_date: {
        type: Date,
        default: Date.now,
        required: true
    }
});

module.exports = mongoose.model("Comments", CommentsSchema);

Это схема файлов ...

const mongoose = require("mongoose");

//CommentImage Schema
const CommentImage = mongoose.Schema({
    docket_no: {
        type: String,
        trim: true,
        required: true
    },
    comment_id: {
        type: String,
        trim: true,
        required: true
    },
    comment_image: {
        type: String,
        trim: true,
        required: true
    }
});

module.exports = mongoose.model("CommentImage", CommentImage);

Это токовый выход-

{
    "comments": [
        {
            "id": "5c3efdf77ad5e5176cc65bc4",
            "user_name": "aaa",
            "role_id": 1,
            "message": "comment test 1",
            "create_date": "2019-01-16T09:48:39.023Z",
            "files": []
        },
        {
            "id": "5c40311bdad6ad1084d24b9c",
            "user_name": "aaa",
            "role_id": 1,
            "message": "comment test 1",
            "create_date": "2019-01-17T07:39:07.081Z",
            "files": []
        }
    ]
}

Желаемый вывод-

{
    "comments": [
        {
            "id": "5c3efdf77ad5e5176cc65bc4",
            "user_name": "aaa",
            "role_id": 1,
            "message": "comment test 1",
            "create_date": "2019-01-16T09:48:39.023Z",
            "files": []
        },
        {
            "id": "5c40311bdad6ad1084d24b9c",
            "user_name": "aaa",
            "role_id": 1,
            "message": "comment test 1",
            "create_date": "2019-01-17T07:39:07.081Z",
            "files": [
                        {
                            filesName: '1547710746976-FD Direct Screen #2.jpg',
                            filePath: 'uploads\\1547710746976-FD Direct Screen #2.jpg' },
                        {
                            filesName: '1547710746987-New Doc 2018-05-31.doc',
                            filePath: 'uploads\\1547710746987-New Doc 2018-05-31.doc' },
                        {
                            filesName: '1547710747024-New Doc 2018-05-31.docx',
                            filePath: 'uploads\\1547710747024-New Doc 2018-05-31.docx' },
                        {
                            filesName: '1547710747053-New Doc 2018-05-31.pdf',
                            filePath: 'uploads\\1547710747053-New Doc 2018-05-31.pdf' }
                    ]
        }
    ]
}

1 Ответ

0 голосов
/ 18 января 2019

Mongoose не поддерживает синхронные операции. Вам нужно будет превратить ваш обработчик маршрута в функцию async, чтобы воспользоваться await. Это заставляет это казаться / читать как это синхронно.

Обработка ошибок должна быть делегирована в Express ' промежуточное ПО для ошибок .

router.get("/history/:docket_no", async (req, res) => {
    const { docket_no } = req.params
    const comments = await Comments.find({ docket_no }).exec()

    if (comments.length < 1) {
        res.status(400).json({ msg: "No comments found."})
        return
    }

    const mappedComments = []
    const mappedImages = []

    for(let i = 0; i < comments.length; i++) {
        const images = await CommentImages
            .find({ comment_id: comments[i]._id })
            .exec()

        for(let j = 0; j < images.length; j++) {
            const filePath = images[j].comment_image
            const fileName = filePath.split("\\")
            mappedImages[j] = {
                filesName: fileName[fileName.length - 1],
                filePath
            }
        }

        console.log(`Images ${mappedImages}`)

        const {
            _id,
            user_name,
            role_id,
            message,
            create_date
        } = comments[i]

        mappedComments[i] = {
            id: _id,
            user_name,
            role_id,
            message,
            create_date,
            files: mappedImages
        }
    }

    res.json({ comments: mappedComments })
})

В приведенном выше примере также используются сокращенные имена свойств и деструктуризация объекта

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