在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.
有办法解决这个问题吗?
5条答案
按热度按时间uz75evzq1#
这个错误基本上发生在你的函数在res.send()之后继续处理执行时。你必须使用return来避免:
ygya80vv2#
在本例中出现此问题是因为
db.close()
,这一行不应该出现在代码中。如果是这样的话,它会很好地工作:
6jjcrrmo3#
错误“错误:Can't set header after they are sent.”告诉你已经处于
body
或completed状态,但是某个函数试图设置header
或statusCode
。当发生此错误时,请查找在写入部分主体之后尝试发送header的内容。这可能是最终被调用两次的回调,或者发送主体之后出现的错误。72qzrwbm4#
你得到那个错误是因为在你的请求处理程序中有一些错误
您正在使用
db.each
方法访问您执行的问题的结果。该方法的目的是允许您执行documentation中定义的一些特殊回调。each()方法使用指定的参数执行SQL查询,并为结果集中的每一行调用回调。
由于你的请求处理程序需要返回查询的结果作为主体,你应该使用
db.all
而不是db.each
。没有任何特殊的代码对结果的每一行执行一些处理。你可以简单地返回整个行集。事实上,在
db.each
的回调中,您正在使用res.send
,这假设您对sqlite
数据库执行的查询行数与您可以尝试重新运行的行数相同。当在查询结果的第一行上执行此操作时,它可以完美地工作,但第二次它将尝试重新发送结果,以覆盖已经发送到的响应。浏览器,它将触发该错误错误[HTTP标题发送错误]:在ServerResponse.setHeader(_http_outgoing.js:526:11)处将头发送到客户端后无法设置头
为了解决这个问题,你要像这样修改代码
baubqpgj5#
只更改本地主机名天气React或node.js
像loacalhost:3000那么你将不得不改变4000