简体   繁体   中英

node can't set headers after they are sent

i know this question asked many time before but still i'm struggling to figure this out. i have a set of js files. first one is index.js

app.all('/backend/*/*', function(req, res){ // backend/product/getProduct 
    serviceType = req.params[0]; 
    methodType  = req.params[1];  

    exports.serviceType= serviceType;  
    exports.methodType= methodType;   

    main.checkService()
}); 

in here im extracting the params and call checkService method in main.js file

main.js

function checkService(){

    switch(index.serviceType){
        case  'product': 
            product.checkMethod();
            break;

        default :
            console.log('no such service')
    }
}

then it move to product.js file

function checkMethod(){ 

    var methodName = index.methodType,
        res = index.res,
        req = index.req;

    switch(methodName){ 
        case 'samplePost':
            var body = req.body; 
            proHan.samplePost(body,function(data,msg,status){
                sendRes(data,msg,status);
            });
            break;

        default :
            console.log('no such method')
    }

    function sendRes(jsonObj,msg,status){
        var resObj = {
            status : status,
            result : jsonObj,
            message : msg
        }
        res.json(resObj);
    }

first it moves to samplePost method in handler.js once the http req finised executing, callback return the results and call sendRes method and send the json

function samplePost(jsonString,cb){ 
    var res = config.setClient('nodeSample');
    // jsonString = JSON.parse(jsonString);
    res.byKeyField('name').sendPost(jsonString,function(data,msg,status){
        cb(data,msg,status); 
    });
}

to send http req i written a common file. that is config.js

function setClient(_cls){ 
  var client = new Client(url);
  return client;
}

function parentClient(url){  
    this.postBody = {
      "Object":{}, 
      "Parameters":{
        "KeyProperty":""
      }
    };


}

function paramChild(){
    parentClient.apply( this, arguments );   

    this.byKeyField = function(_key){
      this.postBody.Parameters.KeyProperty = _key;
      return this;
    } 
}  

function Client(url){
    parentClient.apply( this, arguments ); 

    this.sendPost = function(_body,cb){
      _body = (_body) || {};

      this.postBody.Object = _body;

      var options = {  
          host : 'www.sample.com',
          port : 3300,
          path:  '/somrthing',
          headers: { 
              'securityToken' : '123'
          }
      };

      options.method = "POST";  

      var req = http.request(options, function(response){
        var str = ''
        response.on('data', function (chunk) {
          str += chunk;
        });

        response.on('end', function () {
          cb(JSON.parse('[]'),'success',200)  
        });

      });
      //This is the data we are posting, it needs to be a string or a buffer
      req.on('error', function(response) { 
        cb(JSON.parse('[]'),response.errno,response.code)
      }); 

      req.write(JSON.stringify(this.postBody));
      req.end();
    }
}


paramChild.prototype = new parentClient();  
Client.prototype = new paramChild();   

when i send the first req its work but from then again the server crashes. it seems like i can't call res.end method again in a callback method. how can i fix this. thank you.

you can't call res.end two times. Here is a simple exemple to deal with callback with a basic node server.

const http = require('http');

const hostname = '127.0.0.1';
const port = 4242;
let something = true;

function callback(req, res) {
    something = !something;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Callback Hello World\n');
}

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  if (something) {
    callback(req, res);
  } else {
    something = !something;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Hello World\n');
  }
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM