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.
有没有办法解决这个问题?
答案 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
或已完成状态,但是某些函数试图设置header
或statusCode
。发生此错误时,请在某些正文已写入后,寻找尝试发送标头的内容。这可能是最终被两次调用的回调,或者是在发送正文后出现的错误。
答案 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);
})