웹 프론트엔드 JS 튜토리얼 노드 정적 파일 서버 인스턴스에 대한 자세한 설명

노드 정적 파일 서버 인스턴스에 대한 자세한 설명

Mar 12, 2018 am 09:35 AM
node 섬기는 사람

이 기사에서는 주로 실용적인 노드 정적 파일 서버의 예를 소개합니다. 먼저 해당 기능을 나열한 다음 코드 형식으로 공유하겠습니다.

지원 기능:

  1. 정적 파일 읽기

  2. 아래 디렉토리에 접근하면 index.html 파일이 자동으로 검색됩니다. index.html이 없으면 파일 나열

  3. MIME 유형 지원

  4. CACHE 지원/제어 지원 GZIP 압축 지원, 중단 점 이력서 명령 실행

  5. sub-process running

  6. 1

    먼저 http 모듈을 소개하고 서버를 생성하고 구성 포트를 수신합니다.

     const http = require('http');
     
     const server = http.createServer();
     
     // 监听请求
     server.on('request', request.bind(this));
     
     server.listen(config.port, () => {
      console.log(`静态文件服务启动成功, 访问localhost:${config.port}`);
     });
    로그인 후 복사
  7. 요청을 구체적으로 처리하고 정적 파일을 반환하는 fn을 작성합니다. url 모듈은 다음 경로를 얻습니다.
  8.  const url = require('url');
     const fs = require('fs');
     function request(req, res) {
     const { pathname } = url.parse(req.url); // 访问路径
     
     const filepath = path.join(config.root, pathname); // 文件路径
     
     fs.createReadStream(filepath).pipe(res); // 读取文件,并响应
     }
    로그인 후 복사

    index.html 찾기 지원:

     if (pathname === '/') {
      const rootPath = path.join(config.root, 'index.html');
      try{
       const indexStat = fs.statSync(rootPath);
       if (indexStat) {
        filepath = rootPath;
       }
      } catch(e) {
       
      }
     }
    로그인 후 복사
  9. 디렉토리에 액세스하면 열 출력 파일 디렉토리:
  10.  fs.stat(filepath, (err, stats) => {
     if (err) {
      res.end('not found');
      return;
     }
     if (stats.isDirectory()) {
      let files = fs.readdirSync(filepath);
      files = files.map(file => ({
       name: file,
       url: path.join(pathname, file)
      }));
      let html = this.list()({
       title: pathname,
       files
      });
      res.setHeader('Content-Type', 'text/html');
      res.end(html);
     }
     }
    로그인 후 복사

    html 템플릿:

     function list() {
      let tmpl = fs.readFileSync(path.resolve(__dirname, 'template', 'list.html'), 'utf8');
      return handlebars.compile(tmpl);
     }
    로그인 후 복사
     <!DOCTYPE html>
     <html lang="en">
     <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     <title>{{title}}</title>
     </head>
     <body>
     <h1>hope-server静态文件服务器</h1>
     <ul>
      {{#each files}}
      <li>
       <a href={{url}}>{{name}}</a>
      </li>
      {{/each}}
     </ul>
     </body>
     </html>
    로그인 후 복사
  11. 2.MIME 유형 지원

mime 모듈을 사용하여 파일 유형을 가져오고 인코딩을 설정합니다:

res.setHeader(&#39;Content-Type&#39;, mime.getType(filepath) + &#39;;charset=utf-8&#39;);
로그인 후 복사

3.

http 프로토콜 캐시:

Cache-Control: http1.1 콘텐츠, 클라이언트에게 데이터 캐시 방법 및 규칙을 알려줍니다.

private 클라이언트가 캐시할 수 있습니다.

public 클라이언트와 프록시 서버 모두 캐시할 수 있습니다.

max-age=60 캐시된 콘텐츠는 60초 후에 유효하지 않습니다

no-cache 데이터를 확인하려면 비교 캐시를 사용해야 하며 원본 서버에서 다시 확인하도록 강제해야 합니다
  1. no -store 모든 콘텐츠는 캐시되지 않으며 강제 캐싱이나 비교 캐싱도 실행되지 않습니다
  2. 만료: http1.0 콘텐츠, 캐시 제어는 이를 덮어쓰고 캐시가 만료되는 시기를 클라이언트에 알려줍니다
  3. ETag: 다음에 클라이언트가 요청할 때 요청 헤더에 if-none-match: etag 값을 추가하세요.

    Last- Modified: 다음 번에 클라이언트가 요청할 때 if-modified-since: Last를 추가하세요. -요청 헤더의 값 수정
  4.  handleCache(req, res, stats, hash) {
     // 当资源过期时, 客户端发现上一次请求资源,服务器有发送Last-Modified, 则再次请求时带上if-modified-since
     const ifModifiedSince = req.headers[&#39;if-modified-since&#39;];
     // 服务器发送了etag,客户端再次请求时用If-None-Match字段来询问是否过期
     const ifNoneMatch = req.headers[&#39;if-none-match&#39;];
     // http1.1内容 max-age=30 为强行缓存30秒 30秒内再次请求则用缓存 private 仅客户端缓存,代理服务器不可缓存
     res.setHeader(&#39;Cache-Control&#39;, &#39;private,max-age=30&#39;);
     // http1.0内容 作用与Cache-Control一致 告诉客户端什么时间,资源过期 优先级低于Cache-Control
     res.setHeader(&#39;Expires&#39;, new Date(Date.now() + 30 * 1000).toGMTString());
     // 设置ETag 根据内容生成的hash
     res.setHeader(&#39;ETag&#39;, hash);
     // 设置Last-Modified 文件最后修改时间
     const lastModified = stats.ctime.toGMTString();
     res.setHeader(&#39;Last-Modified&#39;, lastModified);
     
     // 判断ETag是否过期
     if (ifNoneMatch && ifNoneMatch != hash) {
      return false;
     }
     // 判断文件最后修改时间
     if (ifModifiedSince && ifModifiedSince != lastModified) {
      return false;
     }
     // 如果存在且相等,走缓存304
     if (ifNoneMatch || ifModifiedSince) {
      res.writeHead(304);
      res.end();
      return true;
     } else {
      return false;
     }
     }
    로그인 후 복사
  5. 4. 압축

    클라이언트는 요청 헤더에서 gzip, deflate를 통해 콘텐츠를 전송하며, 서버는 이를 기반으로 콘텐츠를 압축합니다. 지원되는 압축 형식. 서버에서 지원하지 않으면 압축이 수행되지 않습니다.
  6.  getEncoding(req, res) {
      const acceptEncoding = req.headers[&#39;accept-encoding&#39;];
      // gzip和deflate压缩
      if (/\bgzip\b/.test(acceptEncoding)) {
       res.setHeader(&#39;Content-Encoding&#39;, &#39;gzip&#39;);
       return zlib.createGzip();
      } else if (/\bdeflate\b/.test(acceptEncoding)) {
       res.setHeader(&#39;Content-Encoding&#39;, &#39;deflate&#39;);
       return zlib.createDeflate();
      } else {
       return null;
      }
     }
    로그인 후 복사
  7. 5. 재개 가능한 업로드

    서버는 요청 헤더의 Range: bytes=0-xxx를 사용하여 Range 요청을 하고 있는지 확인합니다. 이 값이 존재하고 유효한 경우 파일 콘텐츠의 요청된 부분만 사용됩니다. 응답 상태 코드는 206이 되어 Partial Content를 나타내며 Content-Range가 설정됩니다. 유효하지 않은 경우 요청 범위가 만족스럽지 않음을 나타내는 416 상태 코드가 반환됩니다. Range 요청 헤더가 포함되지 않은 경우 계속해서 일반적인 방식으로 응답합니다.
  8.  getStream(req, res, filepath, statObj) {
      let start = 0;
      let end = statObj.size - 1;
      const range = req.headers[&#39;range&#39;];
      if (range) {
       res.setHeader(&#39;Accept-Range&#39;, &#39;bytes&#39;);
       res.statusCode = 206;//返回整个内容的一块
       let result = range.match(/bytes=(\d*)-(\d*)/);
       if (result) {
        start = isNaN(result[1]) ? start : parseInt(result[1]);
        end = isNaN(result[2]) ? end : parseInt(result[2]) - 1;
       }
      }
      return fs.createReadStream(filepath, {
       start, end
      });
     }
    로그인 후 복사
6. 전역 명령 실행

npm 링크를 통해 달성

npm 패키지 디렉터리에 대한 소프트 링크를 생성하고 이를 {prefix}/lib/node_modules/

실행 파일 생성(bin ) 소프트 링크, {prefix}/bin/{name}

에 연결 npm link 명령은 디렉터리와 실행 파일을 연결하여 npm 패키지 명령을 전역적으로 실행 가능하게 만듭니다.

package.json의 구성

 {
 bin: {
 "hope-server": "bin/hope"
 }
 }
로그인 후 복사

프로젝트 아래에 bin 디렉터리 희망 파일을 생성하고 yargs를 사용하여 매개변수를 전달하도록 명령줄을 구성합니다
     // 告诉电脑用node运行我的文件
     #! /usr/bin/env node
     
     const yargs = require(&#39;yargs&#39;);
     const init = require(&#39;../src/index.js&#39;);
     const argv = yargs.option(&#39;d&#39;, {
     alias: &#39;root&#39;,
     demand: &#39;false&#39;,
     type: &#39;string&#39;,
     default: process.cwd(),
     description: &#39;静态文件根目录&#39;
     }).option(&#39;o&#39;, {
     alias: &#39;host&#39;,
     demand: &#39;false&#39;,
     default: &#39;localhost&#39;,
     type: &#39;string&#39;,
     description: &#39;配置监听的主机&#39;
     }).option(&#39;p&#39;, {
     alias: &#39;port&#39;,
     demand: &#39;false&#39;,
     type: &#39;number&#39;,
     default: 8080,
     description: &#39;配置端口号&#39;
     }).option(&#39;c&#39;, {
     alias: &#39;child&#39;,
     demand: &#39;false&#39;,
     type: &#39;boolean&#39;,
     default: false,
     description: &#39;是否子进程运行&#39;
     })
     .usage(&#39;hope-server [options]&#39;)
     .example(
     &#39;hope-server -d / -p 9090 -o localhost&#39;, &#39;在本机的9090端口上监听客户端的请求&#39;
     ).help(&#39;h&#39;).argv;
     
     // 启动服务
     init(argv);
    로그인 후 복사
  1. 7.spawn

    index.js
  2.  const { spawn } = require(&#39;child_process&#39;);
     const Server = require(&#39;./hope&#39;);
     function init(argv) {
      // 如果配置为子进程开启服务
      if (argv.child) {
       //子进程启动服务
       const child = spawn(&#39;node&#39;, [&#39;hope.js&#39;, JSON.stringify(argv)], {
        cwd: __dirname,
        detached: true,
        stdio: &#39;inherit&#39;
       });
     
       //后台运行
       child.unref();
       //退出主线程,让子线程单独运行
       process.exit(0);
      } else {
       const server = new Server(argv);
       server.start();
      }
     }
     
     module.exports = init;
    hope.js
     if (process.argv[2] && process.argv[2].startsWith(&#39;{&#39;)) {
     const argv = JSON.parse(process.argv[2]);
     const server = new Hope(argv);
     server.start();
     }
    로그인 후 복사
  3. 에서 실행되는 하위 프로세스 실행

    8. 소스 코드 및 테스트
소스 코드 주소: hope-server

npm install hope-server -g
로그인 후 복사

아무 디렉토리나 입력하세요

hope-server
로그인 후 복사
관련 권장 사항:

노드 정적 파일 서버에 대한 자세한 설명

다음을 사용하여 작성된 간단한 HTTP 정적 파일 서버 nodejs 및 Python

Node.js 정적 파일 서버 개선된 version_node.js

위 내용은 노드 정적 파일 서버 인스턴스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

eMule 검색이 서버에 연결할 수 없는 문제를 해결하는 방법 eMule 검색이 서버에 연결할 수 없는 문제를 해결하는 방법 Jan 25, 2024 pm 02:45 PM

해결책: 1. eMule 설정을 확인하여 올바른 서버 주소와 포트 번호를 입력했는지 확인하십시오. 2. 네트워크 연결을 확인하고, 컴퓨터가 인터넷에 연결되어 있는지 확인하고, 라우터를 재설정하십시오. 설정이 온라인인 경우 네트워크 연결에 문제가 없으면 서버가 온라인인지 확인해야 합니다. 4. eMule 버전을 업데이트하고 eMule 공식 웹사이트를 방문하여 최신 버전의 eMule 소프트웨어를 다운로드합니다. 5. 도움을 구하세요.

RPC 서버 연결 불가 및 데스크탑 진입 불가 현상에 대한 해결 방법 RPC 서버 연결 불가 및 데스크탑 진입 불가 현상에 대한 해결 방법 Feb 18, 2024 am 10:34 AM

RPC 서버를 사용할 수 없고 데스크톱에서 접속할 수 없는 경우 어떻게 해야 합니까? 최근 몇 년 동안 컴퓨터와 인터넷이 우리 생활 곳곳에 침투했습니다. RPC(원격 프로시저 호출)는 중앙 집중식 컴퓨팅 및 리소스 공유를 위한 기술로서 네트워크 통신에서 중요한 역할을 합니다. 그러나 때때로 RPC 서버를 사용할 수 없어 데스크탑에 들어갈 수 없는 상황이 발생할 수 있습니다. 이 문서에서는 이 문제의 가능한 원인 중 일부를 설명하고 해결 방법을 제공합니다. 먼저 RPC 서버를 사용할 수 없는 이유를 이해해야 합니다. RPC 서버는

CentOS 설치 퓨즈 및 CentOS 설치 서버에 대한 자세한 설명 CentOS 설치 퓨즈 및 CentOS 설치 서버에 대한 자세한 설명 Feb 13, 2024 pm 08:40 PM

LINUX 사용자로서 CentOS에 다양한 소프트웨어와 서버를 설치해야 하는 경우가 많습니다. 이 글에서는 관련 작업을 원활하게 완료할 수 있도록 CentOS에 퓨즈를 설치하고 서버를 설정하는 방법을 자세히 소개합니다. CentOS 설치 퓨즈Fuse는 권한이 없는 사용자가 맞춤형 파일 시스템을 통해 파일 시스템에 액세스하고 작동할 수 있도록 하는 사용자 공간 파일 시스템 프레임워크입니다. CentOS에 퓨즈를 설치하는 것은 매우 간단합니다. 다음 단계를 따르십시오. 1. 터미널을 열고 다음 계정으로 로그인합니다. 루트 사용자. 2. 다음 명령을 사용하여 퓨즈 패키지를 설치합니다. ```yuminstallfuse3. 설치 프로세스 중 프롬프트를 확인하고 'y'를 입력하여 계속합니다. 4. 설치 완료

Dnsmasq를 DHCP 릴레이 서버로 구성하는 방법 Dnsmasq를 DHCP 릴레이 서버로 구성하는 방법 Mar 21, 2024 am 08:50 AM

DHCP 릴레이의 역할은 두 서버가 서로 다른 서브넷에 있더라도 수신된 DHCP 패킷을 네트워크의 다른 DHCP 서버로 전달하는 것입니다. DHCP 릴레이를 사용하면 네트워크 센터에 중앙 집중식 DHCP 서버를 배포하고 이를 사용하여 모든 네트워크 서브넷/VLAN에 IP 주소를 동적으로 할당할 수 있습니다. Dnsmasq는 네트워크에서 동적 호스트 구성을 관리하는 데 도움이 되도록 DHCP 릴레이 서버로 구성할 수 있는 일반적으로 사용되는 DNS 및 DHCP 프로토콜 서버입니다. 이 기사에서는 dnsmasq를 DHCP 릴레이 서버로 구성하는 방법을 보여줍니다. 내용 항목: 네트워크 토폴로지 중앙 집중식 DHCP 서버의 DHCP 릴레이 D에서 고정 IP 주소 구성

PHP를 사용한 IP 프록시 서버 구축을 위한 모범 사례 가이드 PHP를 사용한 IP 프록시 서버 구축을 위한 모범 사례 가이드 Mar 11, 2024 am 08:36 AM

네트워크 데이터 전송에서 IP 프록시 서버는 사용자가 실제 IP 주소를 숨기고 개인정보를 보호하며 액세스 속도를 향상시키는 데 도움을 주는 중요한 역할을 합니다. 이 기사에서는 PHP를 사용하여 IP 프록시 서버를 구축하는 방법에 대한 모범 사례 가이드를 소개하고 구체적인 코드 예제를 제공합니다. IP 프록시 서버란 무엇입니까? IP 프록시 서버는 사용자와 대상 서버 사이에 위치한 중간 서버로서 사용자와 대상 서버 사이의 전송 스테이션 역할을 하며 사용자의 요청과 응답을 전달합니다. IP 프록시 서버를 사용하여

에픽서버가 오프라인 상태일 때 게임에 접속할 수 없으면 어떻게 해야 하나요? 에픽게임즈가 오프라인으로 게임에 입장할 수 없는 이유에 대한 해결책 에픽서버가 오프라인 상태일 때 게임에 접속할 수 없으면 어떻게 해야 하나요? 에픽게임즈가 오프라인으로 게임에 입장할 수 없는 이유에 대한 해결책 Mar 13, 2024 pm 04:40 PM

에픽서버가 오프라인 상태일 때 게임에 접속할 수 없으면 어떻게 해야 하나요? 이 문제는 많은 친구들이 겪었을 것입니다. 이 메시지가 나타나면 정품 게임을 시작할 수 없습니다. 이 문제는 일반적으로 네트워크 및 보안 소프트웨어의 간섭으로 인해 발생합니다. 이 문제의 편집자는 어떻게 설명합니까? 저는 여러분과 솔루션을 공유하고 싶습니다. 오늘의 소프트웨어 튜토리얼이 문제 해결에 도움이 되기를 바랍니다. 에픽 서버가 오프라인일 때 게임에 들어갈 수 없는 경우 해결 방법: 1. 게임 플랫폼과 보안 소프트웨어의 방해를 받을 수 있습니다. 2. 두 번째는 네트워크 변동이 너무 심하다는 것입니다. 라우터를 다시 시작하여 작동하는지 확인해보세요. 조건이 괜찮다면 5g 모바일 네트워크를 사용해 작동해 보세요. 3. 그럼 더 있을 수도 있겠네요

PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? Mar 05, 2025 pm 05:57 PM

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

서버에 PHP FFmpeg 확장을 설치하는 방법은 무엇입니까? 서버에 PHP FFmpeg 확장을 설치하는 방법은 무엇입니까? Mar 28, 2024 pm 02:39 PM

서버에 PHPFFmpeg 확장을 설치하는 방법은 무엇입니까? 서버에 PHPFFmpeg 확장을 설치하면 PHP 프로젝트에서 오디오 및 비디오 파일을 처리하고 오디오 및 비디오 파일의 인코딩, 디코딩, 편집 및 처리와 같은 기능을 구현하는 데 도움이 될 수 있습니다. 이 기사에서는 서버에 PHPFFmpeg 확장을 설치하는 방법과 구체적인 코드 예제를 소개합니다. 먼저, PHP와 FFmpeg가 서버에 설치되어 있는지 확인해야 합니다. FFmpeg가 설치되어 있지 않은 경우 아래 단계에 따라 FFmpe를 설치할 수 있습니다.

See all articles