Node.js 빠른 파일 서버 (HTTP를 통한 정적 파일)


642

Node.js가 바로 사용할 수있는 도구 (와 함께 설치됨 npm)를 사용 하여 HTTP를 통해 폴더 내용을 파일 서버로 노출하는 데 도움이됩니다.

예를 들어

D:\Folder\file.zip
D:\Folder\file2.html
D:\Folder\folder\file-in-folder.jpg

그런 다음 시작하여 D:\Folder\ node node-file-server.js 파일을 통해 액세스 할 수 있습니다.

http://hostname/file.zip
http://hostname/file2.html
http://hostname/folder/file-in-folder.jpg

노드 정적 파일 서버가 요청을 삭제하는 이유는 무엇입니까? 신비로운 일부 참조

표준 node.js 정적 파일 서버

그러한 도구가 없다면 어떤 프레임 워크를 사용해야합니까?

관련 : NodeJS의 기본 정적 파일 서버


나는 이것을 수행 할 수있는 Cachemere라는 모듈을 작성했습니다. 또한 모든 리소스를 자동으로 캐시합니다. 확인해보십시오 : github.com/topcloud/cachemere
Jon

npmjs.com/package/local-web-server- 경량 정적 웹 서버, 제로 구성
Victor

답변:


1090

"사용하기 쉬운 도구"옵션은 http-server 일 수 있습니다.

npm install http-server -g

그것을 사용하려면 :

cd D:\Folder
http-server

또는 다음과 같이 :

http-server D:\Folder

확인하십시오 : https://github.com/nodeapps/http-server


10
대단해. 어떤 이유로 인해 기본 0.0.0.0이 내 개발 환경과 협력하지 않는 이유 때문에 주소 bc를 지정해야했습니다. http-server -a localhost어 던졌다.
Sam Berry

41
사용http-server -a localhost -p 80
Muhammad Umer

10
브라우저 동기화 도 확인 하는 것이 좋습니다. 이는 파일을 수정하면 라이브 업데이트의 추가 보너스와 거의 동일하거나 거의 동일한 작업을 수행 할 수 있습니다.
Nick F

3
--corsAccess-Control-Allow-Origin:*응답 헤더와 함께 보내 려면 (즉, json 파일을 제공 할 때)
Daniel F

9
npx http-server-npx는 필요한 파일을 다운로드하여 실행하는 단일 라이너로 변환합니다.
Mike McKay

186

준비된 도구를 사용하지 않으려면 https://developer.mozilla.org/en-US/docs/Node_server_without_framework 에서 나와 같이 아래 코드를 사용할 수 있습니다 .

var http = require('http');
var fs = require('fs');
var path = require('path');

http.createServer(function (request, response) {
    console.log('request starting...');

    var filePath = '.' + request.url;
    if (filePath == './')
        filePath = './index.html';

    var extname = path.extname(filePath);
    var contentType = 'text/html';
    switch (extname) {
        case '.js':
            contentType = 'text/javascript';
            break;
        case '.css':
            contentType = 'text/css';
            break;
        case '.json':
            contentType = 'application/json';
            break;
        case '.png':
            contentType = 'image/png';
            break;      
        case '.jpg':
            contentType = 'image/jpg';
            break;
        case '.wav':
            contentType = 'audio/wav';
            break;
    }

    fs.readFile(filePath, function(error, content) {
        if (error) {
            if(error.code == 'ENOENT'){
                fs.readFile('./404.html', function(error, content) {
                    response.writeHead(200, { 'Content-Type': contentType });
                    response.end(content, 'utf-8');
                });
            }
            else {
                response.writeHead(500);
                response.end('Sorry, check with the site admin for error: '+error.code+' ..\n');
                response.end(); 
            }
        }
        else {
            response.writeHead(200, { 'Content-Type': contentType });
            response.end(content, 'utf-8');
        }
    });

}).listen(8125);
console.log('Server running at http://127.0.0.1:8125/');

업데이트 외부 수요 / 파일에서 서버에 액세스 해야하는 경우 이전 답변 에서 언급 한 것처럼 아래를 작성하여 node.js 파일에서 CORS를 극복해야합니다

// Website you wish to allow to connect
response.setHeader('Access-Control-Allow-Origin', '*');

// Request methods you wish to allow
response.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

// Request headers you wish to allow
response.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
response.setHeader('Access-Control-Allow-Credentials', true);

최신 정보

Adrian이 언급했듯이 주석에서 그는 여기 에 자세한 설명과 함께 ES6 코드를 작성했습니다 . 어떤 이유로 코드가 원래 사이트에서 사라 졌을 경우 아래 코드를 다시 게시합니다.

const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path');
const port = process.argv[2] || 9000;

http.createServer(function (req, res) {
  console.log(`${req.method} ${req.url}`);

  // parse URL
  const parsedUrl = url.parse(req.url);
  // extract URL path
  let pathname = `.${parsedUrl.pathname}`;
  // based on the URL path, extract the file extention. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extention to MIME typere
  const map = {
    '.ico': 'image/x-icon',
    '.html': 'text/html',
    '.js': 'text/javascript',
    '.json': 'application/json',
    '.css': 'text/css',
    '.png': 'image/png',
    '.jpg': 'image/jpeg',
    '.wav': 'audio/wav',
    '.mp3': 'audio/mpeg',
    '.svg': 'image/svg+xml',
    '.pdf': 'application/pdf',
    '.doc': 'application/msword'
  };

  fs.exists(pathname, function (exist) {
    if(!exist) {
      // if the file is not found, return 404
      res.statusCode = 404;
      res.end(`File ${pathname} not found!`);
      return;
    }

    // if is a directory search for index file matching the extention
    if (fs.statSync(pathname).isDirectory()) pathname += '/index' + ext;

    // read file from file system
    fs.readFile(pathname, function(err, data){
      if(err){
        res.statusCode = 500;
        res.end(`Error getting the file: ${err}.`);
      } else {
        // if the file is found, set Content-type and send data
        res.setHeader('Content-type', map[ext] || 'text/plain' );
        res.end(data);
      }
    });
  });


}).listen(parseInt(port));

console.log(`Server listening on port ${port}`);

2
틀림 response.writeHead(200없이 response.writeHead(404;)
Thomas Hunter II

14
이 코드는 127.0.0.1/../../../etc/passwd 와 같은 작업을 수행하여 파일 트리 위로 올라갈 수 없습니까? 나는 그것에 대한 점검이 보이지 않는다.
Rolf

3
ES6 + 버전에 관심이있는 사람이라면 MIME 형식을 처리하는 정적 파일 서버를 만들었습니다. gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Adrian

1
@Adrian이 코드는 매우 훌륭하지만 루트 액세스 권한을 얻는 방법을 찾았습니다. 해결책은 파일 이름의 선행 기간을 하나로 제한하여 작업을 수행 할 수 없도록하는 ../../etc/password것입니다. gist.github.com/amejiarosario/53afae82e18db30dadc9bc39035778e5
Reed

1
pathname = pathname.replace(/^(\.)+/, '.');
Seph Reed

79

NodeJS 스크립트 내에서 서버를 실행할 수있는 사람들을 위해 :

다음 을 대체 하는 expressjs / serve-static 을 사용할 수 있습니다 connect.static(connect 3에서 더 이상 사용할 수 없음).

myapp.js:

var http = require('http');

var finalhandler = require('finalhandler');
var serveStatic = require('serve-static');

var serve = serveStatic("./");

var server = http.createServer(function(req, res) {
  var done = finalhandler(req, res);
  serve(req, res, done);
});

server.listen(8000);

그런 다음 명령 줄에서 :

  • $ npm install finalhandler serve-static
  • $ node myapp.js

1
참고로 이것은 나를 위해 작동하지 않았습니다. filehandler를 사용하여 설치 npm install filehandler했으며 패키지가 node_modules디렉토리에 나열됩니다 . 그러나 myapp.js노드를 실행 하면 오류가 발생 Error: cannot find module filehandler합니다. filehandler를로드하기 위해 ststment가 필요하다는 의견을 제시하면 앱로드가 정적으로로드되므로 filhandler 패키지에 문제가있는 것처럼 보입니다. 오늘은 2014 년 12 월 12 일이므로이 답변이 게시 된 후 패키지가 변경되었을 수 있습니까?
Lee Jenkins

7
그것은의 final핸들러는 없습니다file
jakub.g

이 솔루션의 또 다른 장점은 파일이 캐시되지 않으므로 코드를 변경할 때 프로세스를 다시 시작할 필요가 없다는 것입니다.
klimat

59

노드가 아니라는 것을 알고 있지만 Python의 SimpleHTTPServer를 사용했습니다.

python -m SimpleHTTPServer [port]

잘 작동하고 파이썬과 함께 제공됩니다.


16
Python3 상당 : python -m http.server [port](언급 된 것은 Python2 용)
jakub.g

OS 이미지와 같은 큰 파일을 제공하는 것과 관련하여 파이썬이 실패합니다. 페도라 23
Zimy

9
PHP :php -S localhost:8000
dennis

나는 이것을 사용하여 항상 폴더의 내용을 빠르게 제공합니다.
Adrian Lynch

33

connect 는 당신이 찾고있는 것일 수 있습니다.

다음으로 쉽게 설치 :

npm install connect

그런 다음 가장 기본적인 정적 파일 서버는 다음과 같이 작성할 수 있습니다.

var connect = require('connect'),
    directory = '/path/to/Folder';

connect()
    .use(connect.static(directory))
    .listen(80);

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

4
이것은 연결되지 않으므로 connect 3에서 더 이상 작동하지 않습니다 connect.static. 교체에 대한 아래 답변을 참조하십시오
jakub.g

4
기본적 으로 Express 와 함께 번들로 제공 되지만 실제로는 별도의 require모듈 "serve-static"에 존재 한다고 생각합니다 .
Oleg

18

npm을 사용하여 Express를 설치 하십시오 . https://expressjs.com/en/starter/installing.html

이 컨텐츠를 사용하여 index.html과 동일한 레벨에서 server.js라는 파일을 작성하십시오.

var express = require('express');
var server = express();
server.use('/', express.static(__dirname + '/'));
server.listen(8080);

다른 위치에 놓으려면 세 번째 줄에 경로를 설정하십시오.

server.use('/', express.static(__dirname + '/public'));

다음 명령을 사용하여 파일을 포함하는 폴더에 CD를 넣고 콘솔에서 노드를 실행하십시오.

node server.js

localhost : 8080를 탐색하십시오


1
안녕하세요, 제대로 실행할 수 있지만이 표시 Cannot GET /됩니다. AWS EC2를 사용하여 서버를 실행합니다.
Wei Xia

1
@Wei Hi, 답변이 늦었습니다. 빠른 Google 검색에서 볼 수 있듯이 디렉토리 구조가 잘못된 것 같습니다. 타겟팅하려는 위치에 index.html 파일이 있어야합니다. 위의 예제를 실행하도록 설정하는 데 5 분이 걸리고 그대로 작동하는지 두 번 확인했습니다. 여기에서 디렉토리 구조에 맞게 경로를 조정하고 서버가 여전히 서버에 필요한 파일을 찾는 지 확인할 수 있습니다.
pasx

path.join(__dirname, 'public')더 크로스 플랫폼입니다.
sdgfsdh

17

약속 대신 One-line ™ Proofs

여기에 이미지 설명을 입력하십시오

처음이다 http-server, hs- 링크

npm i -g http-server   // install
hs C:\repos            // run with one line?? FTW!!

두 번째는 serveZEIT.co입니다- 링크

npm i -g serve         // install
serve C:\repos         // run with one line?? FTW!!

결정하는 데 도움이되는 옵션은 다음과 같습니다.

C : \ Users \ Qwerty> http- 서버 --help
사용법 : http-server [경로] [옵션]

옵션 :
  -p 사용할 포트 [8080]
  -a 사용할 주소 [0.0.0.0]
  -d 디렉토리 목록 표시 [true]
  -i 자동 색인 표시 [true]
  -g --gzip 가능한 경우 gzip 파일 제공 [false]
  -e --ext 제공되지 않은 경우 기본 파일 확장자 [없음]
  -s --silent 출력에서 ​​로그 메시지를 표시하지 않습니다.
  --cors [= headers] "Access-Control-Allow-Origin"헤더를 통해 CORS를 활성화합니다
                     선택적으로 쉼표로 구분 된 CORS 헤더 목록을 제공하십시오.
  -o [경로] 서버를 시작한 후 브라우저 창을 엽니 다
  -c 캐시 시간 (최대 연령) (3600 초), 예를 들어 10 초 동안 -c10.
               캐싱을 비활성화하려면 -c-1을 사용하십시오.
  -U --utc 로그 메시지에 UTC 시간 형식을 사용하십시오.

  -P --proxy 요청을 해결할 수없는 경우 대체 프록시입니다. 예 : http://someurl.com

  -S --ssl https를 활성화합니다.
  -C --cert SSL 인증서 파일의 경로입니다 (기본값 : cert.pem).
  -K --key SSL 키 파일의 경로입니다 (기본값 : key.pem).

  -r --robots /robots.txt에 응답합니다. [User-agent : * \ nDisallow : /]
  -h --help이 목록을 인쇄하고 종료하십시오.
C : \ Users \ Qwerty> serve --help

  사용법 : serve.js [옵션] [명령]

  명령 :

    도움말 표시 도움말

  옵션 :

    -a, --auth 기본 인증 뒤에서 제공
    -c, --cache 브라우저에서 파일을 캐싱하는 시간 (밀리 초)
    -n, --clipless 주소를 클립 보드에 복사하지 않습니다 (기본적으로 비활성화되어 있음)
    -C, --cors Setup * 모든 출처의 요청을 허용하는 CORS 헤더 (기본적으로 비활성화되어 있음)
    -h, --help 사용법 정보 출력
    -i, --ignore 무시할 파일 및 디렉토리
    -o, --open 브라우저에서 로컬 주소를 엽니 다 (기본적으로 비활성화되어 있음)
    -p, --port 수신 대기 포트 (기본값은 5000)
    -S, --silent 콘솔에 아무 것도 기록하지 않습니다
    -s, --single Serve 단일 페이지 응용 프로그램 (`-c`를 1 일로 설정)
    -t, --treeless 스태틱 트리를 표시하지 않음 (기본적으로 비활성화 됨)
    -u, --unzipped GZIP 압축 비활성화
    -v, --version 버전 번호를 출력합니다

변경 사항을 감시해야하는 경우 Henry Tseng의 답변을 참조하십시오 hostr.


14

데모 / 프로 토트 서버 만

이것이 필요한 경우 다음을 시도하십시오.

const http = require('http');
const fs = require('fs');
const port = 3000;
const app = http.createServer((req,res) => {
    res.writeHead(200);
    if (req.url === '/') req.url = '/index.html'; // courtesy of @JosephCho
    res.end(fs.readFileSync(__dirname + req.url));
});

app.listen(port);

참고 : 주소의 일부로 "/index.html"을 사용해야합니다 (예 : " http : // localhost : 3000 / index.html "


2
동기화 버전을 사용하지 마십시오. readStream에서 res로 파이프를 작성하십시오.
Eduard Bondarenko

1
빠르고 더러운 일회성 트릭 포니가 필요한 경우 최상의 답변입니다.
collapsar

1
index.html주소의 일부로 사용하지 않으려면 if (req.url === '/') req.url = '/index.html';바로 뒤에 추가하십시오 res.writeHead(200);.
Joseph Cho

3
@EduardBondarenko가 맞습니다. const stream = fs.createReadStream(...); stream.pipe(res);모두 당신이 필요
저스틴 마이너

8

꽤 좋은 또 다른 정적 웹 서버가 있습니다 : browser-sync.

노드 패키지 관리자를 사용하여 다운로드 할 수 있습니다.

npm install -g browser-sync

설치 후 cmd 프롬프트에서 프로젝트 폴더로 이동하여 다음을 실행하십시오.

browser-sync start --server --port 3001 --files="./*"

브라우저의 현재 폴더에있는 모든 파일을 제공하기 시작합니다.

BrowserSync 에서 더 많은 것을 찾을 수 있습니다

감사.


2
오히려 다른 정적 서버보다 Browsersync를 사용의 장점은 업데이트에게로 지정된 파일마다 페이지 살고 있다는 것입니다 --files. 플래그 변경 (NB 사용자가 지정할 필요가 없습니다를 ./*적극적 업데이트, 예를 들어 주시에 Browsersync를 원하는 키만 - . css/*.css)
닉 F

7

이 페이지의 답변에별로 운이 없었지만 아래는 트릭을 수행하는 것처럼 보였습니다.

server.js다음 내용 의 파일을 추가하십시오 .

const express = require('express')
const path = require('path')
const port = process.env.PORT || 3000
const app = express()

// serve static assets normally
app.use(express.static(__dirname + '/dist'))

// handle every other route with index.html, which will contain
// a script tag to your application's JavaScript file(s).
app.get('*', function (request, response){
  response.sendFile(path.resolve(__dirname, 'dist', 'index.html'))
})

app.listen(port)
console.log("server started on port " + port)

또한 필요한지 확인하십시오 express. 실행 yarn add express --save또는 npm install express --save설정에 따라 ( yarn매우 빠르면 좋습니다 ).

dist콘텐츠를 제공하는 폴더로 변경할 수 있습니다 . 간단한 프로젝트의 경우 폴더에서 제공되지 않았으므로 dist파일 이름을 제거했습니다 .

그런 다음을 실행할 수 있습니다 node server.js. 프로젝트를 Heroku 서버에 업로드해야하므로 package.json파일에 다음을 추가해야했습니다 .

  "scripts": {
    "start": "node server.js"
  }

6

Express 프레임 워크 를 사용하면 이 기능 을 사용할 수 있습니다 .

간단한 파일 제공 앱을 설정하려면 다음을 수행하십시오.

mkdir yourapp
cd yourapp
npm install express
node_modules/express/bin/express

npm install -g express를 사용할 수 있습니까? 그들 $ 표현?
Paul Verest

나는 당신의 단계를 따랐지만, 내 특급에는 bin 폴더 가 없습니다
Qwerty

6

다음 은 Linux / Unix / macOS 터미널 에서이 명령을 실행하는 것만 큼 쉽고 빠르고 풍부한 도구라고 생각하는 의존성이없는 one-file / lightweight node.js 정적 파일 웹 서버 애완 동물 프로젝트입니다 ( 또는 termux 안드로이드) 또는 Node.js를 (시 nodejs-legacy) 데비안 / 우분투가 설치되어 있습니다 :

curl pad.js.org | node 

(문서에 Windows 사용자마다 다른 명령이 있습니다)

유용하다고 생각되는 다른 것들을 지원합니다.

  • 계층 적 디렉토리 인덱스 생성 / 서빙
    • 다른 기준에 따른 정렬 기능
    • Chrome, Firefox 및 기타 브라우저에서 [멀티 파일] 끌어서 놓기와 파일 / 텍스트 전용 복사 붙여 넣기 및 시스템 클립 보드 스크린 샷 붙여 넣기로 브라우저에서 업로드하는 경우 약간의 제한이있을 수 있습니다 (명령 줄에서 끌 수 있음) 그것이 제공하는 옵션)
    • 폴더 / 노트 생성 / 업로드 버튼
  • 잘 알려진 파일 형식에 올바른 MIME 제공 (해제 할 가능성 있음)
  • npm 패키지 및 로컬 도구로 설치 가능 또는 Docker를 통한 영구 서비스로 1 선 설치 가능
  • 빠른 전송을위한 HTTP 206 파일 제공 (멀티 파트 파일 전송)
  • 터미널 및 브라우저 콘솔에서의 업로드
  • CORS 다운로드 / 업로드 (또한 끌 수 있음)
  • 쉬운 HTTPS 통합
  • 보다 안전한 서비스 제공을위한 간단한 명령 줄 옵션 :
    • node.js 8의 패치를 사용하면 먼저 설치하지 않고 옵션에 액세스 할 수 있습니다.curl pad.js.org | node - -h
    • 또는 먼저 시스템 전역 npm 패키지로 [sudo] npm install -g pad.js설치 한 다음 설치된 버전을 사용하여 옵션에 액세스하십시오.pad -h
    • 또는 기본적으로 비교적 안전한 옵션을 사용하는 제공된 Docker 이미지를 사용하십시오. [sudo] docker run --restart=always -v /files:/files --name pad.js -d -p 9090:9090 quay.io/ebraminio/pad.js

도구를 사용한 폴더 색인의 스크린 샷

위에서 설명한 기능은 대부분 도구 http://pad.js.org 의 기본 페이지에 문서화되어 있으며, 내가 사용한 몇 가지 멋진 트릭으로 도구 소스 자체가 제공되는 곳이기도합니다!

툴 소스는 GitHub에 있으며 피드백, 기능 요청 및 ⭐을 환영합니다!


5

npm@5.2.0부터 npm일반 npm과 함께 새 바이너리를 설치하기 시작했습니다 npx. 따라서 현재 디렉토리에서 정적 http 서버를 만드는 하나의 라이너 :

npx serve

또는

npx http-server

4

정적 리소스를 제공하기 위해 노드를 사용하여 성능을 향상 시키려면 뷔페를 사용하는 것이 좋습니다 . 캐싱 HTTP 리버스 프록시라고도하는 웹 애플리케이션 가속기와 유사하게 작동하지만 선택한 디렉토리를 메모리로로드합니다.

뷔페는 완전히 버퍼링 된 접근 방식을 취합니다. 앱이 부팅 될 때 모든 파일이 메모리에 완전히로드되므로 파일 시스템의 화상을 느끼지 않습니다. 실제로 이것은 매우 효율적입니다. 앱 앞에 Varnish를 배치하면 속도가 느려질 수 있습니다! 

우리는 codePile 사이트에서 이것을 사용했으며 1k 동시 사용자 연결로드에서 25 개의 리소스를 다운로드하는 페이지에서 초당 최대 700 회 요청이> 4k 요청 / 초로 증가하는 것을 발견했습니다.

예:

var server = require('http').createServer();

var buffet = require('buffet')(root: './file'); 

 

server.on('request', function (req, res) {

  buffet(req, res, function () {

    buffet.notFound(req, res);

  });

});

 

server.listen(3000, function () {

  console.log('test server running on port 3000');

});


4

아래는 나를 위해 일했습니다.

app.js아래 내용 으로 파일 을 작성하십시오 .

// app.js

var fs = require('fs'),
    http = require('http');

http.createServer(function (req, res) {
  fs.readFile(__dirname + req.url, function (err,data) {
    if (err) {
      res.writeHead(404);
      res.end(JSON.stringify(err));
      return;
    }
    res.writeHead(200);
    res.end(data);
  });
}).listen(8080);

index.html아래 내용 으로 파일 을 작성하십시오 .

Hi

명령 행을 시작하십시오.

cmd

아래에서 실행하십시오 cmd.

node app.js

크롬에서 URL 아래로 이동 :

http://localhost:8080/index.html

그게 다야. 희망이 도움이됩니다.

출처 : https://nodejs.org/en/knowledge/HTTP/servers/how-to-serve-static-files/


3

당신은 서브 미 를 시도 수 있습니다

그것을 사용하는 것은 너무 쉽습니다 :

ServeMe = require('serve-me')();
ServeMe.start(3000);

그게 다야.

PD : 기본적으로 제공되는 폴더는 "public"입니다.



3

일반 node.js에서 :

const http = require('http')
const fs = require('fs')
const path = require('path')

process.on('uncaughtException', err => console.error('uncaughtException', err))
process.on('unhandledRejection', err => console.error('unhandledRejection', err))

const publicFolder = process.argv.length > 2 ? process.argv[2] : '.'
const port = process.argv.length > 3 ? process.argv[3] : 8080

const mediaTypes = {
  zip: 'application/zip',
  jpg: 'image/jpeg',
  html: 'text/html',
  /* add more media types */
}

const server = http.createServer(function(request, response) {
  console.log(request.method + ' ' + request.url)

  const filepath = path.join(publicFolder, request.url)
  fs.readFile(filepath, function(err, data) {
    if (err) {
      response.statusCode = 404
      return response.end('File not found or you made an invalid request.')
    }

    let mediaType = 'text/html'
    const ext = path.extname(filepath)
    if (ext.length > 0 && mediaTypes.hasOwnProperty(ext.slice(1))) {
      mediaType = mediaTypes[ext.slice(1)]
    }

    response.setHeader('Content-Type', mediaType)
    response.end(data)
  })
})

server.on('clientError', function onClientError(err, socket) {
  console.log('clientError', err)
  socket.end('HTTP/1.1 400 Bad Request\r\n\r\n')
})

server.listen(port, '127.0.0.1', function() {
  console.log('👨‍🔧 Development server is online.')
})

이것은 특정 디렉토리의 요청 된 파일 만 제공하는 간단한 node.js 서버입니다.

용법:

node server.js folder port

folderserver.js위치 에 따라 절대적이거나 상대적 일 수 있습니다 . 기본값은 명령 .을 실행하는 디렉토리 node server.js입니다.

port 기본적으로 8080이지만 OS에서 사용 가능한 모든 포트를 지정할 수 있습니다.

귀하의 경우, 나는 할 것입니다 :

cd D:\Folder
node server.js

다음 D:\Folder을 입력하여 브라우저에서 파일을 찾아 볼 수 있습니다http://127.0.0.1:8080/somefolder/somefile.html



2

검색 자의 이익을 위해 Jakub g의 답변을 좋아했지만 약간의 오류 처리를 원했습니다. 분명히 오류를 올바르게 처리하는 것이 가장 좋지만 오류가 발생하면 사이트가 중지되는 것을 방지하는 데 도움이됩니다. 아래 코드 :

var http = require('http');
var express = require('express');

process.on('uncaughtException', function(err) {
  console.log(err);
});

var server = express();

server.use(express.static(__dirname));

var port = 10001;
server.listen(port, function() { 
    console.log('listening on port ' + port);     
    //var err = new Error('This error won't break the application...')
    //throw err
});

업데이트-내 답변은 작동하지만 이제는 http-server 사용에 대한 @Matt Self의 답변을 사용합니다. 잘 작동하는 것 같습니다.
HockeyJ

2

먼저 npm install node-static -g -g 를 통해 노드 정적 서버를 설치하면 시스템에 전역으로 설치 한 다음 파일이있는 디렉토리로 이동하여 static 포트 8080에서 청취 하는 서버를 시작 하고 브라우저를 탐색하고 localhost : 8080 / yourhtmlfilename을 입력하십시오 .


2

이를 위해 NPM 서브 패키지를 사용할 수 있습니다 . NodeJS가 필요하지 않은 경우 빠르고 사용하기 쉬운 도구입니다.

1-PC에 패키지를 설치하십시오.

npm install -g serve

2- serve <path>다음 과 같이 정적 폴더를 제공하십시오 .

d:> serve d:\StaticSite

정적 폴더가 제공되는 포트를 표시합니다. 다음과 같이 호스트로 이동하십시오.

http://localhost:3000

npm노드 패키지 관리자 라는 것을 알고 있으므로 실제로 NodeJS를 사용하고 있습니다.
derickito

나는 "NodeJS stuff"라는 의미는 NodeJS를 사용하고 제안 된 대부분의 답변처럼 파일을 제공하기 위해 표현했다. Serve는 독립 실행 파일이며 NPM은 설치하는 데만 사용되며 직접 다운로드하면됩니다.
Diego Mendes

1

NPM 레지스트리 https://npmjs.org/search?q=server 에서 검색하면 정적 서버 https://github.com/maelstrom/static-server를 발견했습니다.

동료에게 파일을 보내야했지만 100MB의 짐승에게 이메일을 보내지 않아도됩니까? 간단한 예제 JavaScript 응용 프로그램을 실행하려고했지만 file : /// 프로토콜을 통해 실행하는 데 문제가 있습니까? Samba 또는 FTP를 설정하지 않고 LAN에서 미디어 디렉토리를 공유하고 싶거나 구성 파일을 편집해야하는 다른 것을 원하십니까? 그러면이 파일 서버는 당신의 인생을 조금 더 쉽게 만들어 줄 것입니다.

간단한 정적 항목 서버를 설치하려면 npm을 사용하십시오.

npm install -g static-server

그런 다음 파일이나 디렉토리를 제공하려면 다음을 실행하십시오.

$ serve path/to/stuff
Serving path/to/stuff on port 8001

폴더 내용을 나열 할 수도 있습니다.

불행히도 파일을 제공하지 못했습니다 :)


5
그 서버를 만들었습니다. 즉, 파일 서버가에 지어진 아주 가 더 이상 작동하지 않습니다 따라서 왜 노드의 이전 버전. 지금 고칠 시간이 없습니다. 위의 @Oleg의 답변을 사용하는 것이 좋습니다. 작은 노드 실행 파일로 쉽게 묶을 수 있으며 본질적으로 내 일입니다.
Tim Heap

감사합니다. 팀, 매우 전문적인 답변입니다. 그래도 코드는 삭제하지 않지만 readme를 업데이트하십시오.
Paul Verest

1

connect를 사용하는 간단한 정적 서버

var connect = require('connect'),
  directory = __dirname,
  port = 3000;

connect()
  .use(connect.logger('dev'))
  .use(connect.static(directory))
  .listen(port);

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

간단한 웹 서버로 node.js 사용을 참조하십시오.



1

const http = require('http');
const fs = require('fs');
const url = require('url');
const path = require('path');


let mimeTypes = {
  '.html': 'text/html',
  '.css': 'text/css',
  '.js': 'text/javascript',
  '.jpg': 'image/jpeg',
  '.png': 'image/png',
  '.ico': 'image/x-icon',
  '.svg': 'image/svg+xml',
  '.eot': 'appliaction/vnd.ms-fontobject',
  '.ttf': 'aplication/font-sfnt'
};



http.createServer(function (request, response) {
  let pathName = url.parse(request.url).path;
  if(pathName === '/'){
    pathName = '/index.html';
  }
  pathName = pathName.substring(1, pathName.length);
  let extName = path.extName(pathName);
  let staticFiles = `${__dirname}/template/${pathName}`;

      if(extName =='.jpg' || extName == '.png' || extName == '.ico' || extName == '.eot' || extName == '.ttf' || extName == '.svg')
      {
          let file = fr.readFileSync(staticFiles);
          res.writeHead(200, {'Content-Type': mimeTypes[extname]});
          res.write(file, 'binary');
          res.end();
      }else {
        fs.readFile(staticFiles, 'utf8', function (err, data) {
          if(!err){
            res.writeHead(200, {'Content-Type': mimeTypes[extname]});
            res.end(data);
          }else {
            res.writeHead(404, {'Content-Type': 'text/html;charset=utf8'});
            res.write(`<strong>${staticFiles}</strong>File is not found.`);
          }
          res.end();
        });
      }
}).listen(8081);


이 코드로 설명을 추가해야합니다.
Abhinav Gauniyal



0

또한 요청이 떨어지는 이유를 물었습니다. 귀하의 특정 이유가 무엇인지 확실하지 않지만 Node는 실제로이 네트워킹 패턴에 최적화되어 있지 않기 때문에 전용 미들웨어 (nginx, S3, CDN)를 사용하는 서버 정적 콘텐츠가 더 좋습니다. 자세한 설명은 여기 (글 머리 기호 13)를 참조하십시오 : http://goldbergyoni.com/checklist-best-practice-of-node-js-in-production/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.