Отправить запрос с node js - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь сделать пост-запрос с помощью node.js, и когда я пытаюсь его запустить, я получаю данные для отображения в консоли, но не вижу тела моего HTML. В консоли я получаю ошибку

app.js:4 POST http://localhost:8000/addAnimal net::ERR_EMPTY_RESPONSE
postData @ app.js:4
(anonymous) @ app.js:25
app.js:21 Uncaught (in promise) TypeError: Failed to fetch

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

Это мой код:

сервер. 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
app.get('/all', sendData);

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.route('/addAnimal')
  .get(function (req, res) {
    res.sendFile('index.html', {root: 'project1'})
  })
  .post(function (req, res) {
    data.push(req.body)
  })

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

/* 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);
        return newData.json()
      }catch(error) {
      console.log("error", error)
      // appropriately handle the error
      };
  };

  // TODO-Call Function

  postData('/addAnimal', {animal:'lion'});

Любая помощь будет очень оценена.

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

Ответы [ 3 ]

0 голосов
/ 29 января 2020

Измените код приложения. js с помощью приведенного ниже.

/* Function to POST data */
const postData = async (url = "", 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 {
    return response.json();
  } catch (error) {
    console.log("error", error);
    // appropriately handle the error
  }
};

// TODO-Call Function
(async function(){
  let res = await postData("/addAnimal", { animal: "lion" });
  console.log(res);
})();


А также измените метод публикации, как показано ниже.

app.route('/addAnimal')
  .get(function (req, res) {
    res.sendFile('index.html', {root: 'project1'})
  })
  .post(function (req, res) {
    data.push(req.body);
    res.status(200).send(data);
  })
0 голосов
/ 29 января 2020

Попробуйте это:

app.route('/addAnimal')
  .get(function (req, res) {
    res.sendFile('index.html', {root: 'project1'})
  })
  .post(function (req, res) {
    data.push(req.body);
    res.send('done'); // send response
  });
0 голосов
/ 29 января 2020

? Единственная одна причина , почему вы получили подобное сообщение, потому что вы никогда не отправляете response клиенту.

?‍? Итак, Вы должны отправить ответ клиенту. Например, вы можете посмотреть этот код ниже: 101

app.route('/addAnimal')
  .get(function (req, res) {
    res.sendFile('index.html', {root: 'project1'})
  })
  .post(function (req, res) {
    data.push(req.body);
    // send data to client
    // you can change req.body with the object what you want to sent do the client
    res.status(200).send(req.body);
  })

? Обновление: Дополнительная информация

Убедитесь, что вы вызываете конечную точку: http://localhost:8000/addAnimal.

Внешний интерфейс: Убедитесь, что ваш код, подобный следующему коду:

const postData = async ( url = '', 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 {
      console.log(await response.json());
      return await response.json()
    }catch(error) {
      console.log("error", error);
    };
};

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

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