Node.js HTTP - 类型错误:标头名称必须是有效的 HTTP 令牌

新手上路,请多包涵

当我尝试以下列方式设置标头时,它工作得非常好。

 response.setHeader('Content-Type', 'application/json');

但是当我尝试通过以下方式添加变量而不是确切的标头名称/值时,它显示错误:-(

 response.setHeader(result.headers);

如果你 console.log(“headers -> ” + result.header) 结果是一样的。

 headers -> 'Content-Type', 'application/json'

以下是我得到的确切错误,无法弄清楚如何解决它。

  _http_outgoing.js:487

throw new TypeError(`Header name must be a valid HTTP Token ["${name}"]`);

^

 TypeError: Header name must be a valid HTTP Token ["'Content-Type', 'application/json'"]

at validateHeader (_http_outgoing.js:487:11)

at ServerResponse.setHeader (_http_outgoing.js:498:3)

at C:\service-mocker\src\main\app.js:54:22

at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3)

以下是我要实现的完整代码:

 var http = require('http');

var fs = require('fs');

var path = require('path');

var repl = require('repl');

var map={};

var key;

var value;

//create a server object:

var server = http.createServer(function(request, response) {

    fs.readFile("./resources/FileData1.txt", function(err, data) {

        if(err) throw err;

        content = data.toString().split(/(?:\r\n|\r|\n)/g).map(function(line){

            return line.trim();

        }).filter(Boolean)

        var result = processFile(content);

        console.log("url -> " + result.url);

       console.log("status -> " + result.status);

       console.log("headers -> " + result.headers);

       console.log("body -> " + result.body);

       function objToString (obj) {

        var str = '';

        for (var p in obj) {

            if (obj.hasOwnProperty(p)) {

                str +=  obj[p] + '\n';

            }

        }

        return str;

    }

    function processFile(nodes) {

        nodes.forEach(function(node) {

            if(node.startsWith("//")){

                key = node.substring(2, node.length-2).toLowerCase().trim();

                return;

            }

            else{

                value = node;

            }

            // map[key] = value;

            if(key in map){

                map[key].push(value);

            }else{

                map[key]= [value];

            }

        });

        return map;

        // console.log(map);

    }

   if(request.url == result.url ){

        response.setHeader(result.headers);

        // response.setHeader('Content-Type', 'application/json');

        response.write( objToString(result.body) );

        response.statuscode = parseInt( result.status );

        response.end();

    }else {

        // response.writeHead(404, {"Content-Type": "text/html"});

        response.end("No Page Found");

        }

      });

 });

var port = process.env.PORT || 8080;

server.listen(port, function() {

    console.log('Listening on port ' + port);

});

原文由 Fatma Zaman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

看起来 result.headers 返回单个字符串,但是 response.setHeader 需要两个参数:标头名称和标头值。

根据错误消息,您正在执行以下操作:

response.setHeader("'Content-Type', 'application/json'");

相反,您需要将标头拆分为键和值:

 //n.b. make sure that your result only has the one header!
var headerSplit = result.headers.split(',');
var headerKey = headerSplit[0];
var headerVal = headerSplit[1];

response.setHeader(headerKey, headerVal);

原文由 Brian 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您不想使用 response.setHeader 一次设置一个标头,您应该使用 response.writeHead ,它将状态代码和您的标头写入响应。

 response.writeHead(200, headers)

这里 headers 必须是一个 JavaScript 对象。

代替

response.setHeader(result.headers);
response.statuscode = parseInt( result.status );

response.writeHead(parseInt(result.status), parseHeaders(result.headers));

其中 parseHeaders 是一个将 result.headers 解析为对象的函数。

 function parseHeaders(headers) {
    var o = {};
    headers.forEach(header => {o[header.split(',')[0]] = header.split(',')[1]});
    return o;
}

在这个答案中,我假设 result.headers 的格式如下

[
    "header1, header1value",
    "header2, header2value"
]

原文由 Jemi Salo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题