Node / Express / MySQL - сбой сервера при извлечении строк - PullRequest
0 голосов
/ 28 октября 2018

Я довольно новичок в Express и Node MySQL, и я просто пытался разобраться в нескольких вещах.У меня есть обработчик .get() в моем файле app.js и кнопка, которая выбирает обработчик.

Когда я регистрирую 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 отображаются два результата - обе записи в таблице (IЯ настроил это только для того, чтобы я мог учиться).Объект 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

Может ли кто-нибудь дать мне знать, что я делаю не так?

1 Ответ

0 голосов
/ 28 октября 2018

Вы звоните 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) */)
...