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

Node.js Node/Express/MySQL-服务器在检索行时崩溃,node.js,express,node-mysql,Node.js,Express,Node Mysql,我对Express和Node MySQL还很陌生,我只是想弄明白一些事情。我在app.js文件中有一个.get处理程序和一个获取处理程序的按钮 当我将jsonResponse记录到控制台时,它只显示第一个条目-但是app.js似乎正在将所有记录的行发送到cli控制台: // client.js showUsersButton.addEventListener('click', async () => { fetch('/show-users').then(response =>

我对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控制台将显示两个结果-表中的两个条目我设置了这一设置,以便学习。jsonResponse对象被记录到浏览器控制台,它只显示为表中的第一个条目,也可以显示在页面上

但它会使服务器崩溃,原因是:

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一次,因为它会结束流。我不知道您正在使用的库,但它可能会发出结束/完成和错误事件

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) */)