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