【问题标题】:React + Express: Proxy error: Could not proxy request /total from localhstem_errorsReact + Express:代理错误:无法代理来自 localhstem_errors 的请求 /total
【发布时间】:2018-10-04 19:05:33
【问题描述】:

这是我上一个问题的后续问题 React.js: Axois Post stay on pending(but i am getting data)

我的 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"
}

我的 server.js:

const express = require('express');
const app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());


//DB connections
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017";

// console.log that your server is up and running
app.listen(3001, () => console.log(`Listening on port 3001`));


// create a GET route
app.get('/test', (req, res) => {
  var data;
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("mydb");
    var query = { address: "Highway 37" };
    dbo.collection("customers").find(query).toArray(function(err, result) {
      if (err) throw err;
      data = result
      res.send(data[0])
      db.close();
    });
  });
});

//A Get route for getting personal Cart information
app.get('/myCart', (req, res) => {
  var total = 0;
  var data = []

  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("cart");
    dbo.collection("items").find().toArray(function(err, result) {
      if (err) throw err;

      var obj = []
      if(result.length >0){
        for(var i = 0; i < result.length; i++ ){
          var description = result[i].desc;
          var price = result[i].price
          if (!obj[description]) { // Add new object to result
            obj[description] = {
                desc: description,
                total: price,
                amount: 1
            };
          }else{
            obj[description].total += price
            obj[description].amount +=1
          }
        }

        for(var key in obj){
          console.log(obj[key])
          data.push(obj[key])
          total += obj[key].total
        }
      }

      res.send({express: data})
      db.close();
    });
  });



}); 


//a Post route for posting the added item to the data base
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.sendStatus(200)
      console.log("Number of documents inserted: " + result.insertedCount);
      db.close()
    });
  });
});


app.get('/wallet', (req, res) => {
  var data;
  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("wallet");
    dbo.collection("account").findOne({}, function(err, result) {
      if (err) throw err;
      res.send( {express: result.amount})
      db.close();
    });
  });


});

app.get('/total', (req, res) => {
  var total = 0;

  MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
    if (err) throw err;
    var dbo = db.db("cart");
    dbo.collection("items").find().toArray(function(err, result) {
      if (err) throw err;
      for(let item of result){
        total += item.price;
      }
      res.send({express: total})
      db.close();
    });
  });
});

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);
      res.sendStatus(200)
      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);
      res.sendStatus(200)
      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);
      res.sendStatus(200)
      console.log("Numer of record deleted " + res.deletedCount)
      db.close();
    })
  })
})

问题是在将 res.send() 添加到我的代码后,现在我的路由都因代理错误而中断:无法从 localhstem_errors 代理请求 /total。这个问题以前发生过。实际上,自从我创建我的 react+express 应用程序以来,它一直是一个警告,但这只是一个警告,似乎并没有影响我的应用程序,但现在确实如此。此外,导致问题的原因是 post 路由中的 res.send()。在这些 get 路由器中,res.send() 很好

有什么解决办法吗?我觉得这不会是一个微不足道的修复。我可以重新启动我的项目吗?

【问题讨论】:

    标签: javascript node.js reactjs express


    【解决方案1】:

    你可以尝试在 package.json 中设置你的代理吗

    "proxy": {
        "/*":  {
            "target": "http://localhost:3001"
        }
    }
    

    关于下面的错误,res.sendStatus 应该放在 mongo 连接之外

    发送后无法设置标头

    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() 
       }); 
    }); 
       res.sendStatus(200) 
    });
    

    【讨论】:

    • 摆脱代理或添加你都失败的东西。作为 Cannot POST /add 的添加路由响应
    • @aDev 没有暂停。您的后端服务的基本路径是什么?您需要在我的回答中替换您的基本路径 api 名称来代替 basePath。我以为你会用你的后端服务基本路径替换它。基本路径意味着您必须在 index.js 文件中设置它,例如 app.use("/somepath", routes);像这样
    • 让我发布我的 server.js。我不认为我有基本路径,因为路径都是路径
    • @aDev 我明白了。使用我更新的解决方案并立即尝试
    • 同样的事情。我也从控制台收到错误消息:"Can't set headers after they are sent."
    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多