Expressjs错误:发送后无法设置标头

时间:2016-03-11 20:00:14

标签: javascript node.js http express

我有以下代码:

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)

0 个答案:

没有答案