Используя react.js , помещая странные числа в базу данных

#javascript #node.js #reactjs #postgresql

#javascript #node.js #reactjs #postgresql

Вопрос:

У меня есть секундомер в react.js . После окончания работы секундомера пользователь может занести свое время в базу данных. В index.js файл, который я вызываю <App /> , находится ниже, вместе с util.js .

App.js

 import React from 'react';
import { addName } from "./util";

function App() {
  const [name, setName] = React.useState("")

  function handleUpdate(evt) {
    setName(evt.target.value);
  }

  async function handleAddName(evt) {
    await addName(name);
  }

  return <div>
    <p><input type='text' value={name} onChange={handleUpdate} /></p>
    <button className='button-style' onClick={handleAddName}>Add Name</button>
  </div>
}

export default App;
 

util.js

 import "isomorphic-fetch"

export function addName(name) {
    return fetch('http://localhost:3001/addtime', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ name, time: Date.now() })
    })
}
 

Он помещает их имя и время в базу данных, но это странные времена.
введите описание изображения здесь

Каждое из этих значений времени составляло от 1 до 2 секунд на секундомере. У меня в моем узле есть следующее server.js файл:

 app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
...
app.post("/addtime", cors(), async (req,res) => {
    const name = req.body.name;
    const time = req.body.time;
    // const timeStamp = dateFormat(time, dateFormat.masks.isoDateTime);
    
    const template = 'INSERT INTO times (name,time) VALUES ($1,$2)';
    const response = await pool.query(template, [name,time]);
    
    res.json({name: name, time: time});

});
 

Я не могу понять, почему он помещает эти странные числа в базу данных

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

1. если я введу Date.now() в консоль javascript прямо сейчас, я получу 1610330837963 <- вам это кажется странным?

Ответ №1:

Таким образом, числа, которые вы видите в базе данных, — это просто миллисекунды с 1 января 1970 года 00: 00:00 UTC, что является полезным числом, которое вы будете использовать довольно часто, когда отслеживаете, когда что-то произошло. Прямо сейчас я получаю 1610330957356 . Таким образом, число не является необычным.

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

То, как вы это сделаете, все равно будет использоваться Date.now() , но способом, описанным ниже.

 const start_time = Date.now(); // 1610330952000
// ... wait for stopwatch to stop or other events ...
// when the stop has triggered you need
const stop_time = Date.now(); // 1610330957000 after exactly 5 seconds of waiting
const difference = stop_time - start_time // 5000 for 5 seconds
 

Тогда ваше тело вместо этого будет JSON.stringify({ name, time: difference })

Естественно, вы можете сжать их в меньшее количество строк, но я просто хотел, чтобы шаги были понятными.

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

Число, представляющее миллисекунды, прошедшие с эпохи UNIX.

Date.now Документация из MDN

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

1. Я изо всех сил пытаюсь понять, куда я могу поместить свои start_time и end_time. Я помещаю их в свой index.js с основной частью программы, а затем попытался импортировать мой результат в util.js , но это дает мне необработанное предупреждение Promiserejectionwarning и предупреждение об устаревании.

2. @AustinStory К сожалению, из опубликованного вами кода я не могу легко указать на это, но я помогу вам, чем смогу. Вы должны обновить addName , чтобы также требовать переменную времени, и передать это, хотя. Что касается того, где вы вычисляете эту разницу во времени, это будет в компоненте react, который обрабатывает секундомер. Когда вы начинаете, вам нужно обновить состояние, в котором хранится время начала, а когда вы останавливаетесь, вам нужно обновить состояние времени остановки (или непосредственно общее время). Я предполагаю, что у вас может быть другая кнопка, которая запускает «отправить», и вы передаете переменную времени.