广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Node.js中怎么设置HTTP头
  • 286
分享到

Node.js中怎么设置HTTP头

2024-04-02 19:04:59 286人浏览 泡泡鱼
摘要

node.js中怎么设置Http头,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。server.js//basic server的配置

node.js中怎么设置Http头,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

server.js

//basic server的配置文件
var port = 3000;
var server = require('./basicserver').createServer();
server.useFavIcon("localhost", "./docroot/favicon.png");
server.addContainer(".*", "/l/(.*)$", require('./redirector'), {})
server.docroot("localhost", "/", "./docroot");
//server.useFavIcon("127.0.0.1", "./docroot/favicon.png");
//server.docroot("127.0.0.1", "/", "./docroot");
server.listen(port);

basicserver.js

Response Header 服务器发送到客户端

文件扩展名不足以完全恰当的标识文件类型,而且文件扩展名没有标准,于是,人们设计了Content-Type头和整个MIME类型标准来作为数据类型的表示系统。

对于某些应用,特别是一些处理固定数据的小型应用,我们可以精准的知道该使用哪一种Content-Type头,因为应用发送的数据是特定已知的。然而staticHandler能发送任何文件,通常不知道该使用哪种Content-Type。通过匹配文件扩展名列表和Content-Type可以解决这个问题,但是这个方案不完美。最好的实践方案是使用一个外部的配置文件,它通常由操作系统提供。

MIME npm包使用了Apache项目的mime.types文件,该文件包含超过600个Content-Type的有关数据,如果有需要,mime模块也支持添加自定义的MIME类型。

npm install mime

var mime = require('mime');
var mimeType = mime.lookup('image.gif'); //==> image/gif
res.setHeader('Content-Type', mimeType);

一些相关的HTTP头:

Content-Encoding 数据被编码时使用,例如gzip
Content-Language 内容中使用的语言
Content-Length 字节数
Content-Location 能取到数据的一个候补位置
Content-MD5 内容主题的MD5校验和

HTTP协议是无状态的,意味着WEB服务器不能辨认不同的请求发送端。现在普遍的做法是,服务器发送cookie到客户端浏览器,cookie中定义了登陆用户的身份,对于每一次请求,web浏览器都会发送对应所访问网站的cookie。

发送cookie时,我们应以如下方式为Set-Cookie或Set-Cookie2头设一个值:

res.setHeader('Set-Cookie2', ..cookie value..);

var http = require('http');
var url = require('url');
exports.createServer = function(){
  var htserver = http.createServer(function(req, res){
    req.basicServer = {urlparsed: url.parse(req.url, true)};
    processheaders(req, res);
    dispatchToContainer(htserver, req, res);
  });
  htserver.basicServer = {containers: []};
  htserver.addContainer = function(host, path, module, options){
    if (lookupContainer(htserver, host, path) != undefined){
      throw new Error("Already mapped " + host + "/" + path);
    }
    htserver.basicServer.containers.push({host: host, path: path, module: module, options: options});
    return this;
  }
  htserver.useFavIcon = function(host, path){
    return this.addContainer(host, "/favicon.ico", require('./faviconHandler'), {iconPath: path});
  }
  htserver.docroot = function(host, path, rootPath){
    return this.addContainer(host, path, require('./staticHandler'), {docroot: rootPath});
  }
  return htserver;
}
var lookupContainer = function(htserver, host, path){
  for (var i = 0; i < htserver.basicServer.containers.length; i++){
    var container = htserver.basicServer.containers[i];
    var hostMatches = host.toLowerCase().match(container.host);
    var pathMatches = path.match(container.path);
    if (hostMatches !== null && pathMatches !== null){
      return {container: container, host: hostMatches, path: pathMatches};
    }
  }
  return undefined;
}
//用于搜索req.headers数组以查找cookie和host头部,因为这两个字段对请求的分派都很重要
//这个函数在每一个HTTP请求到达时都会被调用
//还有很多其他的HTTP头部字段(Accept Accept-Encoding Accept-Language User-Agent)
var processHeaders = function(req, res){
  req.basicServer.cookies = [];
  var keys = Object.keys(req.headers);
  for (var i = 0; i < keys.length; i++){
    var hname = keys[i];
    var hval = req.headers[hname];
    if (hname.toLowerCase() === "host"){
      req.basicServer.host = hval;
    }
    //提取浏览器发送的cookie
    if (hname.toLowerCase() === "cookie"){
      req.basicServer.cookies.push(hval);
    }
  }
}
//查找匹配的容器,分派请求到对应的容器中
//这个函数在每一个HTTP请求到达时都会被调用
var dispatchToContainer = function(htserver, req, res){
  var container = lookupContainer(htserver, req.basicServer.host, req.basicServer.urlparsed.pathname);
  if (container !== undefined){
    req.basicServer.hostMatches = container.host;
    req.basicServer.pathMatches = container.path;
    req.basicServer.container = container.container;
    container.container.module.handle(req, res);
  }else {
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end("no handler found for " + req.basicServer.host + "/" + req.basicServer.urlparsed);
  }
}

staticHandler.js

//用于处理文件系统内的文件,docroot选项指被存放文件所在文件夹的路径,读取该目录下的指定文件
var fs = require('fs');
var mime = require('mime');
var sys = require('sys');
exports.handle = function(req, res){
  if (req.method !== "GET"){
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end("invalid method " + req.method);
  } else {
    var fname = req.basicServer.container.options.docroot + req.basicServer.urlparsed.pathname;
    if (fname.match(/\/$/)) fname += "index.html"; //如果URL以/结尾
    fs.stat(fname, function(err, stats){
      if (err){
        res.writeHead(500, {'Content-Type': 'text/plain'});
        res.end("file " + fname + " not found " + err);
      } else {
        fs.readFile(fname, function(err, buf){
          if (err){
            res.writeHead(500, {'Content-Type': 'text/plain'});
            res.end("file " + fname + " not readable " + err);
          } else {
            res.writeHead(200, {'Content-Type': mime.lookup(fname),
              'Content-Length': buf.length});
            res.end(buf);
          }
        });
      }
    });
  }
}

faviconHandler.js

//这个处理函数处理对favicon.ico的请求
//MIME模块根据给出的图标文件确定正确的MIME类型,网站图标favicon可以是任何类型的图片,但是我们必须要告诉浏览器是哪个类型
//MIME模块,用于生成正确的Content-Type头
var fs = require('fs');
var mime = require('mime');
exports.handle = function(req, res){
  if (req.method !== "GET"){
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end("invalid method " + req.method);
  } else if (req.basicServer.container.options.iconPath !== undefined){
    fs.readFile(req.basicServer.container.options.iconPath, function(err, buf){
      if (err){
        res.writeHead(500, {'Content-Type': 'text/plain'});
        res.end(req.basicServer.container.options.iconPath + "not found");
      } else {
        res.writeHead(200, {'Content-Type': mime.lookup(req.basicServer.container.options.iconPath),
        'Content-Length': buf.length});
        res.end(buf);
      }
    });
  } else {
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.end("no favicon");
  }
}

redirector.js


//地址http://localhost:3000/l/ex1 会跳转到http://example1.com
var util = require('util');
var code2url = {'ex1': 'http://example1.com', 'ex2': "http://example2.com"};
var notFound = function(req, res){
  res.writeHead(404, {'Content-Type': 'text/plain'});
  res.end("no matching redirect code found for " + req.basicServer.host + "/" + req.basicServer.urlparsed.pathname);
}
exports.handle = function(req, res){
  if (req.basicServer.pathMatches[1]){
    var code = req.basicServer.pathMatches[1];
    if (code2url[code]){
      var url = code2url[code];
      res.writeHead(302, {'Location': url});
      res.end();
    } else {
      notFound(req, res);
    }
  } else {
    notFound(req, res);
  }
}

docroot目录下:有favicon.png

index.html

<html>
<head>
</head>
<body>
  <h2>Index</h2>
  <p>this is a index html.</p>
</body>
</html>

Node.js中怎么设置HTTP头

看完上述内容,你们掌握node.js中怎么设置HTTP头的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网node.js频道,感谢各位的阅读!

--结束END--

本文标题: Node.js中怎么设置HTTP头

本文链接: https://www.lsjlt.com/news/74396.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Node.js中怎么设置HTTP头
    Node.js中怎么设置HTTP头,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。server.js//basic server的配置...
    99+
    2022-10-19
  • javascript 设置http请求头
    JavaScript是一门广泛应用于前端开发的语言,其可以通过设置HTTP请求头,来实现更高效的网络通信。HTTP请求头是HTTP协议中的一部分,位于HTTP请求中的首部,用于传递请求信息,如User-Agent、Accept等等。在Jav...
    99+
    2023-05-14
  • 如何在Django中设置HTTP响应头?
    当你在使用Django构建Web应用程序时,HTTP响应头是一个非常重要的组成部分。HTTP响应头可以包含有关服务器、客户端和传输的有用信息。在本文中,我们将学习如何在Django中设置HTTP响应头,并通过演示代码来帮助你更好地理解这个过...
    99+
    2023-07-07
    http 响应 django
  • php怎么设置p3p头
    本文操作环境:windows7系统、PHP7.1版、Dell G3电脑。php怎么设置p3p头?PHP 通过设置P3P头来实现跨域访问COOKIE我的是CentOS的系统(Linux 内核)编辑HOST vi /etc/hosts加入127...
    99+
    2017-09-27
    php
  • vue-resouce中怎么设置请求头
    本篇文章为大家展示了vue-resouce中怎么设置请求头,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。第一种:在Vue实例中设置var vm ...
    99+
    2022-10-19
  • springboot怎么设置响应头
    在Spring Boot中,可以通过使用`@RestController`注解标注一个类,并且使用`@RequestMapping`...
    99+
    2023-10-25
    springboot
  • PHP的header()函数:如何设置HTTP响应头
    PHP是一种常用的服务器端脚本语言,用于动态网页、网站开发和服务器管理等。在PHP中,使用header()函数可以设置HTTP响应头,控制某些HTTP协议参数,实现功能增强和安全保障等。本文将为您介绍如何使用PHP的header()函数设置...
    99+
    2023-11-03
    设置 HTTP响应头 header()函数
  • nginx中proxy_set_head怎么设置头部信息
    nginx中proxy_set_head怎么设置头部信息,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。导读反向代理服务器是一种代理服务器,用于管理从外部网络到内部网络的连接或任...
    99+
    2023-06-05
  • 从零开始学习Node.js系列教程之设置HTTP头的方法示例
    本文实例讲述了Node.js设置HTTP头的方法。分享给大家供大家参考,具体如下: server.js //basic server的配置文件 var port = 3000; var server =...
    99+
    2022-06-04
    示例 从零开始 方法
  • qtableview怎么设置表头文本
    您可以使用以下代码设置QTableView的表头文本:```python# 设置表头文本model = QStandardItemM...
    99+
    2023-09-22
    qtableview
  • HttpClient请求中怎么设置Content-Type标头
    本篇文章给大家分享的是有关HttpClient请求中怎么设置Content-Type标头,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。POST...
    99+
    2022-10-19
  • php怎么设置http状态码
    本篇内容主要讲解“php怎么设置http状态码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php怎么设置http状态码”吧!php设置http状态码的方法:首先创建一个PHP示例文件;然后通过...
    99+
    2023-06-20
  • php怎么设置http请求体
    在PHP中,可以使用以下两种方法设置HTTP请求体:1. 使用`file_get_contents()`函数发送POST请求,并设置...
    99+
    2023-08-15
    php
  • 怎么从头开始设置webpack 5
    本篇内容主要讲解“怎么从头开始设置webpack 5”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么从头开始设置webpack 5”吧!如果你是从 webpa...
    99+
    2022-10-19
  • 怎么设置HTTP代理服务器
    这期内容当中小编将会给大家带来有关怎么设置HTTP代理服务器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。打开浏览器,找到工具按钮。如果你的工具栏是隐藏的,你可以用Alt键呼出。步骤为工具-interne...
    99+
    2023-06-14
  • Node.js中怎么设置站点目录
    这篇文章主要介绍“Node.js中怎么设置站点目录”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js中怎么设置站点目录”文章能帮助大家解决问题。一、为什么需要设置站点目录在Web服务器中,...
    99+
    2023-07-06
  • Node.js中怎么设置沙箱环境
    今天就跟大家聊聊有关Node.js中怎么设置沙箱环境,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。怎样安全的执行动态脚本?我们先看看通常都能如何在 ...
    99+
    2022-10-19
  • php怎么设置数组头部增加
    在PHP中,要在数组头部增加元素可以使用多种方法。在本篇文章中,我们将会介绍两种常见的方法,一种是使用array_unshift函数,另一种是使用“+”运算符。以下是详细解释:方法一:使用array_unshift函数array_unshi...
    99+
    2023-05-19
  • 如何在 PHP 中设置 HTTP 代理设置
    在 PHP 中设置 HTTP 代理设置可以通过修改 `stream_context` 的参数来实现。下面是一个示例代码:```php...
    99+
    2023-09-26
    PHP
  • 在ASP.NET Core中怎么使用HTTP标头传播
    这篇文章主要介绍“在ASP.NET Core中怎么使用HTTP标头传播”,在日常操作中,相信很多人在在ASP.NET Core中怎么使用HTTP标头传播问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作