Node/Express/MySQL - 服务器在检索行时崩溃

Node/Express/MySQL - Server crashes on retrieval of rows

我对 Express 和 Node MySQL 还很陌生,我一直在尝试解决一些问题。我的 app.js 文件中有一个 .get() 处理程序和一个获取处理程序的按钮。

当我将 jsonResponse 记录到控制台时,它只显示第一个条目 - 但 app.js 似乎正在发送所有行(如记录到 cli 控制台):

// client.js
showUsersButton.addEventListener('click', async () => {
  fetch('/show-users').then(response => {
    return response.json();
  }).then(jsonResponse => {
    console.log(jsonResponse); // first row of table
    contents.innerHTML = jsonResponse; // [object Object]
    contents.innerHTML += jsonResponse.name; // name value for first row in table
  })
})

这是单击按钮的事件处理程序。以下是处理此问题的相关“.get()”方法:

// app.js
app.get('/show-users', (req, res) => {
  connection.connect(error => {
    if (error) throw error;

    console.log('Connected to the database.');
  })

  let query = connection.query('SELECT * FROM users');

  query.on('result', row => {
    console.log(row); // logs all entries of the table
    res.send(row);
  })
})

单击该按钮后,CLI 控制台会显示两个结果 - table 中的两个条目(我设置它只是为了学习)。 jsonResponse 对象被记录到浏览器控制台,它仅显示为 table 中的第一个条目 - 它也可以显示到页面。

但它使服务器崩溃:

Server side JS is running.
The server is listening for requests at port 5000.
Connected to the database.
RowDataPacket { id: 1, name: 'Danny', level: 1 }
RowDataPacket { id: 2, name: 'Chloe', level: 1 }
C:\Users\User\desktop\node-site\node_modules\mysql\lib\protocol\Parser.js:80
        throw err; // Rethrow non-MySQL errors
        ^

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:494:11)... etc etc

谁能告诉我我做错了什么?

您多次呼叫 res.send。以下代码将 运行 每个结果一次:

query.on('result', row => {
  console.log(row); // logs all entries of the table
  res.send(row);
})

每个请求只能调用一次 res.send,因为它会结束流。我不知道您使用的库,但它可能会发出 end/done 和错误事件

const results = [];
query.on('result', row => {
  console.log(row); // logs all entries of the table
  results.push(result)
})

query.on("end", ()=> res.send(results))

query.on("error", ()=> /* res.send(some error) */)