节点发送后无法设置标头

时间:2017-01-11 18:10:19

标签: javascript node.js

我知道很久以前就问过这个问题,但我仍在努力解决这个问题。我有一组js文件。第一个是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()
}); 

在这里我提取参数并在checkService文件中调用main.js方法

main.js

function checkService(){

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

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

然后转移到product.js文件

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);
    }

首先转移到samplePost中的handler.js方法 一旦http req finised执行,回调返回结果并调用sendRes方法并发送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); 
    });
}

发送http req我写了一个通用文件。那是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();   

当我发送第一个req它的工作但从那时起服务器崩溃了。好像我不能在回调方法中再次调用res.end方法。我怎样才能解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:2)

你不能两次打电话给res.end。这是一个简单的例子来处理基本节点服务器的回调。

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}/`);
});