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



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

bin/www中:

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

路由/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;

路由/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.

有办法解决这个问题吗?

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

return res.send()

在这种情况下出现此问题是因为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;

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

您得到该错误是因为您的请求处理程序中存在一些错误

您正在使用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);
})

仅更改loacalhost名称weather react或node.js

类似loacalhost:3000然后你将不得不更改4000

最新更新