React.js: Axois Post остается в ожидании (но я получаю данные) - PullRequest
0 голосов
/ 04 октября 2018

Я использую axios для выполнения пост-запроса к Node.js.Данные поступают на сервер, и я могу выполнить с ними некоторые действия.Тем не менее, в сети, он всегда остается в ожидании.

Ниже приведены примеры маршрутизаторов:

  handleSubmit(e){
    e.preventDefault();
    var added = this.getAddedItems()

    console.log("added is", added)
    if(added.length > 0){
      for(let i of added){
        console.log(i)
      }

      axios({ method: 'post', url: '/add', data: added})
    }
  }

handleDelete(e,desc){
        e.preventDefault()
        axios({method: "post", url: "/remove", data:{name: desc}})

    var newTotal = 0;

    var newArray = this.state.testData.filter(function(obj){
        return obj.desc !== desc
    })

    newArray.map(item => (
        newTotal += item.total
    ))

    console.log(newTotal)
    this.setState({ 
        testData: newArray,
        total: newTotal
    })
}

   handleSubmit(e){
        e.preventDefault()
        var remain = this.state.wallet - this.state.total

        this.setState({
            buyAttempt: true,
        })

        console.log("remain is " + remain)
        console.log("length " + this.state.testData.length)
        if(remain >= 0 && this.state.testData.length > 0){
            this.setState({buySuccessful: true})
            axios({ method: 'post', url: '/buy', data: { amount : remain}})



            this.setState({
                wallet:remain,
                testData: [],
                //itemNum:0
            })
        }
    }

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

Я также получаю сообщение об ошибке, которое буквально сломает мое приложение

POST http://localhost:3000/add net::ERR_EMPTY_RESPONSE
Uncaught (in promise) Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:87)

POST http://localhost:3000/buynet::ERR_EMPTY_RESPONSE
Uncaught (in promise) Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:87)

POST http://localhost:3000/remove net::ERR_EMPTY_RESPONSE
Uncaught (in promise) Error: Network Error
    at createError (createError.js:16)
    at XMLHttpRequest.handleError (xhr.js:87) 

В чем мне нужна помощь: 1: Как решить эту проблему 2: Есть ли лучший альтернативный способ (естественный способ реагирования на выполнение почтового запроса)

Мой server.js

app.post('/buy', (req, res) => {
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) console.log(err);
    var dbo = db.db("wallet");
    var myquery = { amount: {$gt: 0} }
    var newquery = { $set: {amount: req.body.amount}}
    dbo.collection("account").updateOne(myquery, newquery, function(err, re) {
      if (err) console.log(err);
      console.log("Wallet updated:", req.body.amount )
      db.close();
    });
  });


  MongoClient.connect(url, { useNewUrlParser: true}, function(err, db) {
    if (err) console.log(err);
    var dbo = db.db("cart");
    dbo.collection("items").deleteMany({}, function(err, res){
      if (err) console.log(err);
      console.log("numer of data deleted " + res.deletedCount)
      db.close();
    });
  });


});

app.post('/remove', (req,res) => {
  MongoClient.connect(url, { useNewUrlParser: true}, function(err,db){
    if (err) console.log(err);
    var dbo = db.db("cart");
    var myquery = { desc: req.body.name}
    console.log(req.body.name)
    dbo.collection("items").deleteMany(myquery, function(err,res){
      if(err) console.log(err);
      console.log("Numer of record deleted " + res.deletedCount)
      db.close();
    })
  })
})

app.post('/add', (req, res) => {
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("cart");
    var objs = req.body;
    dbo.collection("items").insertMany(objs, function(err, result) {
      if (err) console.log(err);
      console.log("Number of documents inserted: " + result.insertedCount);
      db.close()
    });
  });
});

Package.json:

{
  "name": "my-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "axios": "^0.18.0",
    "bootstrap": "^4.1.3",
    "express": "^4.16.3",
    "mongodb": "^3.1.6",
    "react": "^16.5.2",
    "react-dom": "^16.5.2",
    "react-html-parser": "^2.0.2",
    "react-router-dom": "^4.3.1",
    "react-scripts": "1.1.5",
    "reactstrap": "^6.4.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  },
  "proxy": "http://localhost:3001"
}

1 Ответ

0 голосов
/ 04 октября 2018

Проблема в том, что вы не отправляете resposne обратно в вызов API.Вы должны отправлять ответ на каждый вызов API, как я упоминал ниже

app.post('/buy', (req, res) => {
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) console.log(err);
    var dbo = db.db("wallet");
    var myquery = { amount: {$gt: 0} }
    var newquery = { $set: {amount: req.body.amount}}
    dbo.collection("account").updateOne(myquery, newquery, function(err, result) {
      if (err) console.log(err);
      res.send("Wallet updated);
      //if you want to send in json format then
      res.json({"message": "Wallet updated", "result": result});
      console.log("Wallet updated:", req.body.amount )
      db.close();
    });
  });


  MongoClient.connect(url, { useNewUrlParser: true}, function(err, db) {
    if (err) console.log(err);
    var dbo = db.db("cart");
    dbo.collection("items").deleteMany({}, function(err, result){
      if (err) console.log(err);
      res.send("numer of data deleted " + result.deletedCount)
      db.close();
    });
  });


});

app.post('/remove', (req,res) => {
  MongoClient.connect(url, { useNewUrlParser: true}, function(err,db){
    if (err) console.log(err);
    var dbo = db.db("cart");
    var myquery = { desc: req.body.name}
    console.log(req.body.name)
    dbo.collection("items").deleteMany(myquery, function(err,result){
      if(err) console.log(err);
      res.send("Numer of record deleted " + result.deletedCount)
      db.close();
    })
  })
})

app.post('/add', (req, res) => {
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("cart");
    var objs = req.body;
    dbo.collection("items").insertMany(objs, function(err, result) {
      if (err) console.log(err);
      res.send("Number of documents inserted: " + result.insertedCount);
      db.close()
    });
  });
});

Также в каждом вызове API вы дважды выбираете res, поэтому меняйте один res на результат или любое имя по вашему выбору.потому что узел запутается в двух рез.Так что я изменил res, чтобы привести к каждому вызову API.

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