客户端无法获取服务器响应

时间:2019-08-11 14:48:17

标签: node.js reactjs express fetch-api

问题

我将AWS EC2部署了一个create-react-app Webapp。它用于显示数据库中的数据并向其发送数据。我使用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 函数中的提取,第二个错误对应于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部分中的代码以将正确的响应发送回服务器? 和 我猜对了吗?

1 个答案:

答案 0 :(得分:0)

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

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

我也用prepared语句代替了普通的sql查询。这些用于防止sql注入。我希望它现在可以正常工作。