Node.js/Vuetify — Есть ли способ получать данные с сервера в зависимости от времени?

#node.js #vue.js #vuetify.js

Вопрос:

У меня есть node.js сервер, настроенный для проекта vuetify. На моем сервере я анализирую csv-файл, в котором содержится информация о расписании и времени. В моем проекте vuetify есть ли способ получить данные из csv-файла в зависимости от времени использования клиента?

Комментарии:

1. Пожалуйста, приведите пример. Как я это вижу — у вас есть информация о времени в CSV-07:00 Завтрак; 08:00 Выход на работу; 12:00 Обеденный перерыв. И вы хотите получить разные результаты, в зависимости от времени доступа к сайту. Так что, если я получу доступ к нему около 7, я получу обратно «Завтрак», если около 12, я получу обратно обеденный перерыв. Это правильно?

2. @IvanShulev это правильно!

Ответ №1:

Хорошо, давайте приведем пример.

Насколько я понимаю, в вашем CSV-файле есть следующая информация:

 Time,Activity
07:00,Breakfast
08:00,Go to work
12:00,Lunch break
 

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

 [
   { Time: '07:00', Activity: 'Breakfast' },
   { Time: '08:00', Activity: 'Go to work' },
   { Time: '12:00', Activity: 'Lunch break' }
]
 

Вам нужно отправить эту информацию своим клиентам, поэтому, предполагая, что вы используете Экспресс, вы можете использовать что-то вроде:

 const csv = require('csv-parser');
const fs = require('fs');
const express = require('express');
const app = express();
const timeSchedule = [];

function parseCsv() {
    return new Promise((resolve, reject) => {
        fs.createReadStream('data.csv')
        .pipe(csv())
        .on('data', (data) => timeSchedule.push(data))
        .on('error', (err) => reject(err))
        .on('end', () => {
            csvParsed = true;
            resolve();
        });
    }
}

app.get('/scheduled-for/:hour', function (req, res) {
    // You need to come up with the logic for your case
    // As an example, I will assume that if I make a request at any time
    // between 7 and 8, I will get "Breakfast"
    // between 8 and 9 - "Go to work"
    // between 12 and 13 - "Lunch break"
    parseCsv().then(() => {
        res.json(timeSchedule.find(row => row.Time.startsWith(req.params.hour)))
    })

})
 

Пожалуйста, обратите внимание, что все вышесказанное происходит на сервере Nodejs.

От клиента вам нужно будет позвонить scheduled-for в справку о ПОЛУЧЕНИИ с часовым парамом. Другой вариант заключается в том, чтобы позволить серверной части определить час запроса, используя объект даты, но это более гибко для клиента. Это также позволит избежать проблем с различными часовыми поясами, учитывая, что ваши клиентские запросы поступают из разных часовых поясов, чем тот, в котором работает ваш сервер.

Предполагая, что вы используете axios в своем приложении Vue, самый простой способ получить расписание-вызвать API в своем компоненте:

 new Vue({
  el: '#app',
  data () {
    return {
      activity: null
    }
  },
  mounted () {
    axios
      .get('https://urlToYourApi/v1/scheduled-for/'   new Date().getHours())
      .then(schedule => {
          if (schedule) {
              this.activity = schedule.Activity;
          }
          else {
              console.log("No activity found for this hour!");
          }
      }
  }
})
 

Этот код НЕ предназначен для производства! Вам нужно обрабатывать много случаев, например, new Date().getHours() возвращать часы с одной цифрой, анализировать CSV, не говоря уже о самой логике домена, которая зависит от вашего конкретного случая. Это всего лишь простой пример. Я надеюсь, что это поможет направить вас в правильном направлении!