【问题标题】:Client side can't fetch server response客户端无法获取服务器响应
【发布时间】:2019-12-18 10:19:05
【问题描述】:

问题

我将 create-react-app webapp 部署到 aws ec2。它用于显示来自数据库的数据并向其发送数据。我使用 ExpressJS、CORS 和 MySQL。 使用以下代码,我获取相应的 URL,server.js 发回数据库内容。到这里为止,一切正常。

getBets = _ => {
        fetch("http://ec2***.amazonaws.com
            .then(response => response.json())
            .then(response => this.setState({bets: response.data}))
            .catch(err => console.error(err))
    };

使用以下代码向数据库发送数据时出现问题:

addBet = _ => {

        const { bet } = this.state;

        fetch(`http://ec2***.amazonaws.com/bets/add?name=${bet.person_name}&bet=${bet.time_bet}`)
            .then(response => response.json())
            .then(this.getBets)
            .catch(err => console.error(err))
    };

点击 addBet-函数会填充数据库,但在 chrome 中我出现以下错误:

GET http://ec2***.amazonaws.com/bets/add?name=Peter%20Pan5&bet=10:17%205 net::ERR_EMPTY_RESPONSE

和

TypeError: Failed to fetch

关于chrome dev-tools,第一个错误对应addBet函数中的fetch,第二个错误对应catch部分。

在服务器端,我有以下用于处理提取的代码:

app.get("/bets/add", (req, res) => {
    const {name, bet} = req.query;
    const INSERT_BET = `INSERT INTO bets (name, bet, timestamp) VALUES("${name}", "${bet}", CURTIME())`;
    connection.query(INSERT_BET, (err, res) => {
        if (err) {
            return res.send(err);
        }
        else {
            return res.send("succesfully added your bet");
        }
    })
});

我想提一下,app.get 部分中的 res 参数是未使用的。这告诉我我的 IDE。 经过大量时间深入研究 expressJS 和 fetch api 的主题后,我猜 app.get 部分不会向服务器发送响应。但是获取需要一些响应。

我的问题

如何更改 app.get 部分中的代码才能将正确的响应发送回服务器? 和 我猜对了吗?

【问题讨论】:

  • 控制台有错误吗?状态码?
  • 我最初的帖子中的两个错误是唯一的。在服务器端,我不熟悉 ec2 实例的控制台。或者换句话说,我无法获得与我的问题对应的日志。
  • 我的意思是浏览器的控制台从你调用 API 的地方

标签: node.js reactjs express fetch-api


【解决方案1】:

在 MYSQL 中,当您执行插入查询时,您会在回调函数中返回错误、结果和字段,如下所示:

connection.query('INSERT INTO posts SET ?', {title: 'test'}, function (error, 
results, fields) {
  if (error) throw error;
  console.log(results.insertId);
});

你已经使用了参数 res 作为结果,然后你使用了 res.send(),它现在对应于回调函数中的 res 参数,而不是 res 对象。像这样重写它:

app.get("/bets/add", (req, res) => {
const {name, bet} = req.query;
const INSERT_BET = `INSERT INTO bets (name, bet, timestamp) VALUES(?,?,?)`;
connection.query(INSERT_BET,[name,bet,CURTIME()] ,(err, result) => {
    if (err) {
        return res.send(err);
    }
    else {
        return res.send("succesfully added your bet");
    }
})
});

我还使用准备好的语句来代替普通的 sql 查询。这些用于防止 sql 注入。我希望它现在可以工作。

【讨论】:

  • 修改后出现json错误:SyntaxError: Unexpected token < in JSON at position 0 和 GET http://ec2***.amazonaws.com/bets/add?name=Peter%20Pan&bet=10:17%20Uhr 500 (Internal Server Error) 修改后的代码可以处理json格式的数据吗?
  • 好吧,显然这成功了。新错误是由于响应的非 json 格式。我将其更改为正确的 json 样式。现在,我没有收到任何(新)错误。非常感谢。你真棒!顺便说一句:这个链接对我也有帮助Unexpected Token < in JSON at Position 0
  • @marco 您正在发送字符串响应以防插入成功和错误响应(console.log 错误并检查其类型),然后在客户端您已编写 response.json ()。由于响应不在 json 中,这可能就是它显示该错误的原因。从响应中删除 .json 并使用 console.log() 在控制台中查看错误的类型
  • 不客气。我还检查了这个链接的 json 错误
猜你喜欢
  • 2018-12-02
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2021-10-21
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多