Node.js Node/Express/MySQL-服务器在检索行时崩溃
我对Express和Node MySQL还很陌生,我只是想弄明白一些事情。我在app.js文件中有一个.get处理程序和一个获取处理程序的按钮 当我将jsonResponse记录到控制台时,它只显示第一个条目-但是app.js似乎正在将所有记录的行发送到cli控制台: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 =>
// 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) */)