当我尝试按以下方式设置标题时,它工作得非常好。
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);
});
答案 0 :(得分:1)
看起来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);
答案 1 :(得分:0)
模板文字使用反向标记而不是引号。
答案 2 :(得分: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"
]