Как иметь одинаковый формат даты в монго и реагировать? - PullRequest
1 голос
/ 30 мая 2019

Я столкнулся с проблемой. Я работаю над приложением календаря. Проблема в том, что после заполнения сбора данных mongo днями года все выглядит нормально, но после извлечения данных на фронт реакции я заканчиваю с неправильным форматом даты и часовым поясом. Я попытался отладить его, и при извлечении данных с Calendar.find({}, (err, calendar)) ... календарь кажется проанализированным с неправильной временной зоной даты. Подробнее ниже.

Хорошо, это контроллер, который заполняет базу данных днями года:

exports.generateCalendar = (req, res) => {
    let days = [];
    for(let i=1; i<366; i++) {

        const dayOfTheWeek = new Date(new Date().getFullYear(), 0, i).getDay();
        if(dayOfTheWeek === 0 || dayOfTheWeek === 6){
            days.push({day: new Date(new Date().getFullYear(), 0, i), offWork: true, description: ' '});
        }
        else{
            days.push({day: new Date(new Date().getFullYear(), 0, i), offWork: false, description: ' '});
        }
    }

    Calendar.insertMany(days, (err) => {
        res.json('done');
    });
};

Вывод этого контроллера представляет собой набор документов, подобных этому:

_id: 5cefc2e5c6db7f47401ba261
offWork: false
day: 2019-01-01T00:00:00.000+01:00
description: " "

_id: 5cefc2e5c6db7f47401ba262
offWork: false
day: 2019-01-02T00:00:00.000+01:00
description: " "

Следующим шагом будет сбор всей коллекции и отправка ее на фронт с помощью этого простого контроллера:

exports.getCalendar = (req, res) => {
    Calendar.find({}, (err, calendar) => {
        if(err){
            res.json('Error while fetching data');
        }else{
            res.json(calendar);
            }

    })
};

Однако вывод выборки:

{ offWork: false,
     _id: 5cefc2e5c6db7f47401ba261,
     day: 2018-12-31T23:00:00.000Z,
     description: ' ',
     __v: 0 },
   { offWork: false,
     _id: 5cefc2e5c6db7f47401ba262,
     day: 2019-01-01T23:00:00.000Z,
     description: ' ',
     __v: 0 },
   { offWork: false,
     _id: 5cefc2e5c6db7f47401ba263,
     day: 2019-01-02T23:00:00.000Z,
     description: ' ',
     __v: 0 },

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

Я создал цикл for, который помещает новую дату в новый массив:

            let calendarArray = [];

                for(let i=0; i<calendar.length; i++){
                    calendarArray.push({day: calendar[i].day.toString(), offWork: calendar[i].offWork, description: calendar[i].description});
                }
                res.json(calendarArray);

И вывод этого корректен на внешнем интерфейсе, но в неправильном формате:

Tue Jan 01 2019 00:00:00 GMT+0100 (GMT+01:00)       
Wed Jan 02 2019 00:00:00 GMT+0100 (GMT+01:00)       
Thu Jan 03 2019 00:00:00 GMT+0100 (GMT+01:00)   

Идеальным решением была бы база данных в формате YYYY-MM-DD или с тем же форматом даты в монго и после выборки.

1 Ответ

0 голосов
/ 31 мая 2019

Хорошо, я сделал то, что установил moment.js и использовал его при переносе дат в новый массив и отправке их на фронт:


exports.getCalendar = (req, res) => {
    Calendar.find({}, (err, calendar) => {
        if(err){
            res.json('Error while fetching data');
        }else{
            let calendarArray = [];

                for(let i=0; i<calendar.length; i++){
                    calendarArray.push({_id: calendar[i]._id, day: moment(calendar[i].day).format("DD-MM-YYYY"), offWork: calendar[i].offWork, description: calendar[i].description, name: calendar[i].name});
                }

            res.json(calendarArray);
            }
    })
};

Не идеальное решение, но, видимо, оно работает. Если у вас есть другие идеи, как решить эту проблему, я буду рад их услышать.

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