我有以下代码:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({extended: false});
// Add headers
app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', '*');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', false);
// Pass to next layer of middleware
next();
});
app.post('/something', urlencodedParser, function(req, res) {
if (!req.body.param) {
res.send(JSON.stringify({
error: 'no_param'
}));
return;
} else {
someFunction(req.body.param, function(err, result) {
if (err) {
res.send(JSON.stringify({
error: 'some error'
}));
return;
} else {
if (result) {
pool.getConnection(function(err, connection) {
connection.query('SELECT * from something where something = something;', function(err, rows, fields) {
if (err) {
res.send(JSON.stringify({
error: 'some error'
}));
} else {
console.log('Lets see if the code gets up to here? '); //Code does come here and this does print
res.send(JSON.stringify({
valid: 'is_valid'
}));
}
})
connection.release();
});
} else {
}
}
});
}
});
function someFunction(some_param, callback) {
var options = { //start of options
hostname: 'graph.facebook.com',
port: 443,
//path: '/oauth/?appsecret_proof='+hash+'&access_token='+at,
path: '/v2.5/me?fields=id&access_token=[access_token]'
method: 'GET'
}; //end of options
var callback2 = function(response) { //start of callback
var str = '';
//another chunk of data has been recieved, so append it to `str`
response.on('data', function(chunk) { //start of response on;
str += chunk;
}); //end of response on;
response.on('end', function() { //start of response end
callback(null, 'success');
}); //end of response end
response.on('error', function() {
callback('error');
});
}; //end of callback2
https.request(options, callback2).end();
};
我收到一个http请求到我的快递服务器,做一些事情,并发回一个json响应。当用户发送请求时,它会正常处理,直到它到达需要发送响应的位置(代码到此为止:
console.log('让我们看看代码是否到达这里?'); //代码呢 来这里打印
但我的node / express服务器然后崩溃说明Node.js错误:发送后无法设置标头。我不知道为什么会发生这种情况,因为我没有看到“res”对象设置任何标题?
我得到的堆栈跟踪是
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
at ServerResponse.header (/home/bobby/nodejs/node_modules/express/lib/response.js:718:10)
at ServerResponse.send (/home/bobby/nodejs/node_modules/express/lib/response.js:163:12)
at ServerResponse.json (/home/bobby/nodejs/node_modules/express/lib/response.js:249:15)
at /home/bobby/nodejs/app.js:449:21
at /home/bobby/nodejs/app.js:810:21
at /home/bobby/nodejs/node_modules/jsonwebtoken/index.js:155:18
at doNTCallback0 (node.js:419:9)
at process._tickDomainCallback (node.js:389:13)