使用Node JS发布请求

时间:2020-01-29 14:32:08

标签: javascript node.js express

我正在尝试使用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

该函数似乎正在运行,但实际的后期请求部分却没有。我一生无法弄清楚自己在做什么错。

这是我的代码:

server.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)
  })

app.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 :(得分:0)

?收到这样的消息的唯一一个原因,这是因为您从未将response发送给客户端。

?‍?因此,您应将回复发送给客户端。例如,您可以在下面查看此代码:?

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);
    };
};

我希望它能对您有所帮助。

答案 1 :(得分:0)

使用以下内容更改app.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);
})();


还可以如下更改post方法。

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);
  })

答案 2 :(得分:0)

尝试一下:

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
  });