node js Javascript объект, показанный в теле HTML, но не в терминале и консоли - PullRequest
0 голосов
/ 01 февраля 2020

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

Пока у меня есть форма, которая передает элемент fav объекта , Когда я go на страницу (перед отправкой формы) я вижу в консоли и терминале:

  {
    animal: 'lion',
    fact: "a lion's roar can be heard five miles away",
    fav: {}
  }

Так что это правильно вызывает данные из / fakeAnimalData. Когда я отправляю форму, я получаю две трети объекта (снова), а затем еще один объект с элементом fav. Мне нужно, чтобы эти два объекта были объединены в один, но код этого не делает.

[{"animal":"lion","fact":"a lion's roar can be heard five miles away","fav":{}},{"fav":"lions are big"}]

На консоли ничего не отображается. И в терминале я получаю только:

{ animal: undefined, fact: undefined, fav: 'lions are big' }

Еще одна более незначительная проблема заключается в том, что в видео объект НЕ появляется в теле HTML. Форма остается там, и объект отображается только в консоли и терминале. Я думаю, это потому, что мои маршруты настроены неправильно, но я не уверен. На данный момент объекты заменяют форму, и я хотел бы по-прежнему видеть форму и видеть только полный объект в консоли и терминале.

Надеюсь, я объяснил это правильно. Это мой код:

сервер. js:

projectData = {};

/* Express to run server and routes */
const express = require('express');

/* Start up an instance of app */
const app = express();

/* Dependencies */
const bodyParser = require('body-parser')
/* Middleware*/
app.use(express.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const cors = require('cors');
app.use(cors());

/* Initialize the main project folder*/
app.use(express.static('project1'));

const port = 8000;
/* Spin up the server*/
const server = app.listen(port, listening);
 function listening(){
    // console.log(server);
    console.log(`running on localhost: ${port}`);
  };

// GET route

const animalData = [];
const fakeData = {animal: "lion", fact: "a lion's roar can be heard five miles away"};

app.get('/fakeAnimalData', getFakeData);

function getFakeData(req, res) {
  console.log(fakeData);
  res.send(fakeData);
};

app.get('/all', getData);

function getData(req, res){
  res.send(animalData)
  console.log(animalData)
}

// function sendData (request, response) {
//  response.send(projectData);
// };

// POST route
app.post('/add', callBack);

function callBack(req,res){
  res.send('POST received');
}



// POST an animal
const data = [];


  // TODO-Call Function

app.post('/addAnimal', addAnimal);

app.route('/')
  .get(function (req, res) {
    res.sendFile('index.html', {root: 'project1'})
  })
  .post(addAnimal)

//app.route('/addAnimal')
//  .get(function (req, res) {
//    res.sendFile('index.html', {root: 'project1'})
//  })
//  .post(addAnimal)

function addAnimal(req, res){

  newEntry = {
    animal: req.body.animal,
    fact: req.body.fact,
    fav: req.body.fav
  }

  //data.push(req.body);
//  res.status(200).send(req.body);
  animalData.push(newEntry)
  res.send(animalData)
  console.log(animalData)
};

приложение. js:

function performAction(e){
const fav = document.getElementById('fav').value;

getAnimal('/fakeAnimalData')
.then(async function(data){
    console.log(data);
  let res = await postData('/addAnimal', {animal: data.animal, fact: data.fact, fav: fav});
  console.log(res);
});
};

const getAnimal = async (url) =>{
  const res = await fetch(url);
  try {
    const data = await res.json();
    console.log(data)
    return data;
  } catch(error) {
    console.log()
  }
};

/* Function to POST data */
const postData = async ( url = '', data = {})=>{
    console.log(data);
      const response = await fetch(url, {
      method: 'POST', // *GET, POST, PUT, DELETE, etc.
      credentials: 'same-origin', // include, *same-origin, omit
      headers: {
          'Content-Type': 'application/json',
      },
      body: JSON.stringify(data), // body data type must match "Content-Type" header        
    });

      try {
        const newData = await response.json();
        console.log(newData);
        // console.log(newData);
        return newData
        console.log(await response.json());
        return await response.json()
      }catch(error) {
      console.log("error", error);
      // appropriately handle the error
      };
  };

  // TODO-Call Function
getAnimal('/fakeAnimalData')
.then(async function(data){
    console.log(data);
  let res = await postData('/addAnimal', {animal: data.animal, fact: data.fact, fav: fav});
  console.log(res);
});

Мне кажется, что я рядом, но кусочки не собираются вместе. Я не могу начать говорить вам, насколько я был бы признателен за любые указания по этому поводу, которые вы можете дать мне.

Спасибо, Майк

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

?‍? Если вам нужно только объединить ваш animalData, то вы можете сделать следующее: Измените тип anymalData с array на object.

Итак, ваш код будет выглядеть так: 100

  • До: const animalData = [];
  • После: let animalData = {};

?‍? После изменения вашего animalData с array на object, теперь вы должны изменить свою функцию addAnimal. Таким образом, он будет выглядеть следующим образом: 10

function addAnimal(req, res){
    // make sure it's not empty
    console.log(req.body);

    // combine your req.body with animalData
    // Object.assign(animalData, req.body); <= the second option
    animalData = { ...animalData, ...req.body }

    // send response to the client
    res.status(200).send(animalData)
};

После того, как вы измените свою функцию addAnimal с кодом выше ?, Теперь вы можете попробовать снова.

Надеюсь, это поможет вам ?.

0 голосов
/ 01 февраля 2020

Можете ли вы отправить метод, который вы хотите отправить, и результат, который вы хотите получить?

Если вы хотите использовать / addAnimal метод записи:

var request = require('request');
var options = {
  'method': 'POST',
  'url': 'http://localhost:8000/addAnimal',
  'headers': {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({"animal":"lion","fact":"a lion's roar can be heard five miles away","fav":{}})

};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

Таким образом, каждый отправленный запрос будет помещен в массив «animalData», который вы задаете глобально.

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