【问题标题】:node can't set headers after they are sent节点发送后无法设置标头
【发布时间】:2017-02-17 01:19:45
【问题描述】:

我知道这个问题以前问过很多次,但我仍然在努力解决这个问题。我有一组 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()
}); 

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

ma​​in.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);
    }

首先它移动到handler.js 中的samplePost 方法 一旦 http req 完成执行,回调返回结果并调用 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();   

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

【问题讨论】:

  • 你有 git 链接吗?试一试
  • @Shankar Shastri 很遗憾没有
  • 由于 http 的工作原理,您不能对一个请求发送多个响应...您有两种选择,要么合并两个响应以同时发送,要么使用套接字代替 http,,,跨度>

标签: javascript node.js


【解决方案1】:

你不能调用 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}/`);
});

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 2015-04-06
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多