npm启动后,API调用工作正常,但刷新时崩溃

时间:2020-07-12 21:41:26

标签: javascript node.js api express npm

http://localhost:9000/testAPI上有一个API调用。

bin / www 中:

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

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 个答案:

答案 0 :(得分:1)

此错误基本上是在您的函数在res.send()之后继续处理执行过程时发生的。您必须使用return来避免这种情况:

return res.send()

答案 1 :(得分:1)

在这种情况下,由于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;

答案 2 :(得分:0)

错误“错误:发送标头后无法设置标头”。告诉您您已经处于body或已完成状态,但是某些函数试图设置headerstatusCode。发生此错误时,请在某些正文已写入后,寻找尝试发送标头的内容。这可能是最终被两次调用的回调,或者是在发送正文后出现的错误。

答案 3 :(得分:0)

您收到该错误,因为请求处理程序中存在一些错误

您正在使用db.each方法来访问所执行问题的结果。该方法的目的是允许您执行documentation

中定义的一些特殊回调

eacher()方法执行带有指定参数的SQL查询,并为结果集中的每一行调用一个回调。

由于请求处理程序中的需求是将查询结果作为正文返回,因此您应使用db.all而不是db.each。没有任何特殊的代码可以对结果的每一行进行某种处理。您可以简单地返回整个行集。

db.each的回调中您正在使用res.send的事实假定您对sqlite数据库执行的查询的行数可以尝试重新运行`res。发送。在查询结果的第一行上执行此操作时,它工作正常,但第二次它将尝试重新发送该结果,以覆盖接缝,以覆盖已发送到浏览器的响应,并触发该错误

错误[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);
})