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

z4iuyo4d  于 2023-03-21  发布在  Java
关注(0)|答案(5)|浏览(191)

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.

有办法解决这个问题吗?

uz75evzq

uz75evzq1#

这个错误基本上发生在你的函数在res.send()之后继续处理执行时。你必须使用return来避免:

return res.send()
ygya80vv

ygya80vv2#

在本例中出现此问题是因为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;
6jjcrrmo

6jjcrrmo3#

错误“错误:Can't set header after they are sent.”告诉你已经处于body或completed状态,但是某个函数试图设置headerstatusCode。当发生此错误时,请查找在写入部分主体之后尝试发送header的内容。这可能是最终被调用两次的回调,或者发送主体之后出现的错误。

72qzrwbm

72qzrwbm4#

你得到那个错误是因为在你的请求处理程序中有一些错误
您正在使用db.each方法访问您执行的问题的结果。该方法的目的是允许您执行documentation中定义的一些特殊回调。
each()方法使用指定的参数执行SQL查询,并为结果集中的每一行调用回调。
由于你的请求处理程序需要返回查询的结果作为主体,你应该使用db.all而不是db.each。没有任何特殊的代码对结果的每一行执行一些处理。你可以简单地返回整个行集。
事实上,在db.each的回调中,您正在使用res.send,这假设您对sqlite数据库执行的查询行数与您可以尝试重新运行的行数相同。当在查询结果的第一行上执行此操作时,它可以完美地工作,但第二次它将尝试重新发送结果,以覆盖已经发送到的响应。浏览器,它将触发该错误
错误[HTTP标题发送错误]:在ServerResponse.setHeader(_http_outgoing.js:526:11)处将头发送到客户端后无法设置头
为了解决这个问题,你要像这样修改代码

db.all('SELECT athlete_id, name, surname FROM Athlete', function(err, rows) {
   res.send(rows);
})
baubqpgj

baubqpgj5#

只更改本地主机名天气React或node.js
像loacalhost:3000那么你将不得不改变4000

相关问题