Вызов API работает нормально после запуска npm, но вылетает при обновлении - PullRequest
0 голосов
/ 13 июля 2020

Имеется вызов API для http://localhost:9000/testAPI.

In bin / www*1005*:

var port = normalizePort(process.env.PORT || '9000');
app.set('port', port);

in routes / index. js :

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

в routes / testAPI. js:

var express = require('express');
var router = express.Router();
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('./db/ocs_athletes.db');

router.get('/', function (req, res, next) {
  db.serialize(function () {
    db.all('SELECT athlete_id, name, surname FROM Athlete', function (
      err,
      row
    ) {
     return res.send(row);
    });
  });

  db.close();
});

module.exports = router;

Когда выполняется команда npm start, API работает, при переходе к http://localhost:9000/testAPI отображается JSON, содержащий данные.

Проблема появляется при обновлении страницы. Он говорит: Страница не может быть достигнута , а в терминале выдает следующую ошибку:

GET /testAPI 304 20.628 ms - -
undefined:0



Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (/home/rares/Documents/Projects/ocsApp/api/node_modules/express/lib/response.js:767:10)
    at ServerResponse.json (/home/rares/Documents/Projects/ocsApp/api/node_modules/express/lib/response.js:264:10)
    at ServerResponse.send (/home/rares/Documents/Projects/ocsApp/api/node_modules/express/lib/response.js:158:21)
    at Statement.<anonymous> (/home/rares/Documents/Projects/ocsApp/api/routes/testAPI.js:12:11)
    at Statement.replacement (/home/rares/Documents/Projects/ocsApp/api/node_modules/sqlite3/lib/trace.js:25:27) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! api@0.0.0 start: `node ./bin/www`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the api@0.0.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

Есть ли способ решить эту проблему?

Ответы [ 4 ]

1 голос
/ 13 июля 2020

Эта проблема возникает в этом случае из-за того, что db.close() этой строки не должно быть в коде.

Так что все будет нормально, если это будет так:

var express = require('express');
var router = express.Router();
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('./db/ocs_athletes.db');

router.get('/', function (req, res, next) {
  db.serialize(function () {
    db.all('SELECT athlete_id, name, surname FROM Athlete', function (
      err,
      row
    ) {
     return res.send(row);
    });
  });
});

module.exports = router;
1 голос
/ 13 июля 2020

эта ошибка возникает в основном, когда ваша функция продолжает обрабатывать выполнение после вашего res.send (). вы должны использовать return, чтобы этого избежать:

return res.send()
0 голосов
/ 13 июля 2020

Вы получаете эту ошибку, потому что в обработчике вашего запроса есть ошибка

Вы используете метод db.each для доступа к результату вопроса, который вы задали. Цель этого метода - позволить вам выполнить специальный обратный вызов, как определено в документации

Метод each () выполняет запрос SQL с указанными параметрами и вызовами. обратный вызов для каждой строки в наборе результатов.

Поскольку ваши потребности в обработчике запроса должны возвращать в качестве тела результат запроса, вы должны использовать db.all вместо db.each. Нет никакого специального кода, который бы обрабатывал каждую строку результата. Вы можете просто вернуть весь набор строк.

Тот факт, что в обратном вызове db.each вы используете res.send, это предполагает, что количество строк, которое вы выполнили для вашего запроса sqlite базы данных, вы можете попытается повторно запустить `res.send. Когда это выполняется в первой строке результата запроса, он работает отлично, но во второй раз он попытается повторно отправить результат, который переопределит ответ, который уже был отправлен в браузер, и вызовет эту ошибку

Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту на ServerResponse.setHeader (_http_outgoing. js: 526: 11)

Чтобы исправить это, вы измените ваш код вроде этого

db.all('SELECT athlete_id, name, surname FROM Athlete', function(err, rows) {
   res.send(rows);
})
0 голосов
/ 13 июля 2020

Ошибка «Ошибка: не удается установить заголовки после отправки». сообщает вам, что вы уже находитесь в состоянии body или завершении, но какая-то функция пыталась установить header или statusCode. Когда возникает эта ошибка, ищите что-то, что пытается отправить заголовок ПОСЛЕ записи некоторой части тела. Это могут быть обратные вызовы, которые в конечном итоге вызываются дважды, или ошибка, возникающая после отправки тела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...