간단한 웹 서버로 node.js 사용


1103

매우 간단한 HTTP 서버를 실행하고 싶습니다. 모든 GET 요청 example.comindex.html 일반 HTML 페이지 그것을 제공하지만, 같은 (즉, 정상적인 웹 페이지를 읽을 때와 같은 경험).

아래 코드를 사용하여의 내용을 읽을 수 있습니다 index.html. 어떻게 봉사 할 index.html일반 웹 페이지로?

var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end(index);
}).listen(9615);

아래의 한 가지 제안은 복잡하며 작성해야합니다. get 사용하려는 각 리소스 (CSS, JavaScript, 이미지) 파일에 줄 해야합니다.

일부 이미지, CSS 및 JavaScript로 단일 HTML 페이지를 제공하려면 어떻게해야합니까?


21
npm 모듈 "connect"를 살펴보십시오. 이러한 기본 기능을 제공하며 많은 설정 및 기타 패키지의 기초입니다.
Mörre

5
솔루션을 답변으로 놓고 올바른 것으로 표시해야합니다.
graham.reeds

8
Eric B. Sowell 이 노드 js에서 정적 파일 제공 이라고하는 완벽한 솔루션을 찾을 수있었습니다 . 모든 것을 읽으십시오. 추천.
idophir

1
내가 작성한 캐시미어 (Cachemere)라는 모듈을 살펴보십시오. 또한 모든 리소스를 자동으로 캐시합니다. github.com/topcloud/cachemere
Jon

1
local-web-server 가 좋은 예입니다
Lloyd

답변:


992

가장 간단한 Node.js 서버는 다음과 같습니다.

$ npm install http-server -g

이제 다음 명령을 통해 서버를 실행할 수 있습니다.

$ cd MyApp

$ http-server

NPM 5.2.0 이상을 사용 http-server하는 경우와 함께 설치하지 않고 사용할 수 있습니다 npx. 프로덕션 환경에서는 사용하지 않는 것이 좋지만 localhost에서 서버를 빠르게 실행할 수있는 좋은 방법입니다.

$ npx http-server

또는 웹 브라우저를 열고 CORS 요청을 활성화하는 다음과 같이 시도해보십시오.

$ http-server -o --cors

더 많은 옵션을 보려면 GitHub에 대한 설명서를http-server 확인 하거나 다음을 실행하십시오.

$ http-server --help

NodeJitsu에 대한 많은 다른 멋진 기능과 간단한 데드-배포.

기능 포크

물론 자신의 포크로 기능을 쉽게 채울 수 있습니다. 이 프로젝트의 기존 800 개 이상의 포크 중 하나에서 이미 수행 된 것을 찾을 수 있습니다.

라이트 서버 : 자동 새로 고침 대안

에 대한 좋은 대안은 http-server입니다 light-server. 파일 감시 및 자동 새로 고침 및 기타 여러 기능을 지원합니다.

$ npm install -g light-server 
$ light-server

Windows 탐색기에서 디렉토리 컨텍스트 메뉴에 추가

 reg.exe add HKCR\Directory\shell\LightServer\command /ve /t REG_EXPAND_SZ /f /d "\"C:\nodejs\light-server.cmd\" \"-o\" \"-s\" \"%V\""

간단한 JSON REST 서버

프로토 타입 프로젝트를 위해 간단한 REST 서버를 작성해야하는 경우 json-server 가 원하는 것일 수 있습니다.

자동 새로 고침 편집기

대부분의 웹 페이지 편집기 및 IDE 도구에는 이제 소스 파일을보고 웹 페이지가 변경 될 때 자동으로 새로 고치는 웹 서버가 포함되어 있습니다.

Visual Studio Code와 함께 Live Server 를 사용 합니다.

오픈 소스 텍스트 편집기 브래킷은 또한 NodeJS 정적 웹 서버가 포함되어 있습니다. 브라켓에서 HTML 파일을 열고 " Live Preview "를 누르면 정적 서버가 시작되고 페이지에서 브라우저가 열립니다. HTML 파일을 편집하고 저장할 때마다 브라우저가 ** 자동 새로 고침됩니다. 적응 형 웹 사이트를 테스트 할 때 특히 유용합니다. 여러 브라우저 / 창 크기 / 장치에서 HTML 페이지를 엽니 다. HTML 페이지를 저장 하고 자동으로 새로 고침 할 때 적응 형 컨텐츠가 작동하는지 즉시 확인하십시오 .

PhoneGap 개발자

하이브리드 모바일 앱을 코딩하는 경우 PhoneGap 팀이 새로운 PhoneGap 앱 과 함께이 자동 새로 고침 개념을 채택 했다는 것을 알고 자 할 것입니다 . 개발 중에 서버에서 HTML5 파일을로드 할 수있는 일반 모바일 앱입니다. JS / CSS / HTML 파일을 변경하는 경우 하이브리드 모바일 앱의 개발주기에서 느린 컴파일 / 배포 단계를 건너 뛸 수 있기 때문에이 방법은 매우 매끄 럽습니다. 대부분의 시간입니다. 또한 phonegap serve파일 변경을 감지 하는 정적 NodeJS 웹 서버 (run )를 제공합니다 .

PhoneGap + Sencha Touch 개발자

Sencha Touch 및 jQuery Mobile 개발자를 위해 PhoneGap 정적 서버 및 PhoneGap 개발자 앱을 광범위하게 조정했습니다. Sencha Touch Live 에서 확인하십시오 . 데스크탑 컴퓨터에서 방화벽 외부의 URL로 정적 서버를 프록시하는 --qr QR 코드 및 --localtunnel을 지원합니다! 사용 톤. 하이브리드 모바일 개발자를위한 엄청난 속도 향상.

코르도바 + 이온 프레임 워크 개발자

로컬 서버 및 자동 새로 고침 기능이 ionic도구에 구워졌습니다 . ionic serve앱 폴더에서 실행 하십시오. 더 나은 ... ionic serve --labiOS와 Android의 자동 새로 고침을 나란히 볼 수 있습니다.


9
npm install live-server -g 같은 것을 원하지만 파일 변경을 감지했을 때 자동 재로드 기능을 사용하는 경우

3
작은 "gotcha"-. http-server는 기본적으로 0.0.0.0에서 사이트를 제공합니다. 따라서 IP 주소를 로컬 테스트 서비스 http-server -a localhost
제공자

1
예 ... 0.0.0.0은 모든 IP 네트워크 장치 (WiFi, 케이블, Bluetooth)의 모든 IP에 바인딩하므로 해킹 당할 수 있으므로 모든 공용 네트워크에서 나쁜 생각입니다. 안전한 방화벽 네트워크 내에서 앱을 데모하여 다른 사람을 보여 주거나 동일한 네트워크의 모바일 장치에 연결하려는 경우 그렇게 나쁘지 않습니다.
Tony O'Hagan

정말 유용한 작은 도구입니다. 서버에서 실행중인 많은 Node 앱이 있으므로 8080 이외의 포트를 선택하기 위해 "-p"옵션을 추가합니다. 예 : nohup http-server -p 60080 & (백그라운드에서 시작하여 연결을 끊을 수 있습니다) 쉘 세션.) 포트가 세계에 열려 있는지 확인해야합니다. 예 : iptables -I INPUT 1 -p tcp --dport 60090 -j ACCEPT (많은 Linux 시스템에서)
Blisterpeanuts

서비스로 실행하는 방법이므로 명령 프롬프트를 닫아도 사용할 수 있습니다. 그렇지 않으면 이런 종류의 도구를 제공하는 도구가 있습니까?
Sandeep sandy

983

Node.js와 함께 ConnectServeStatic 을 사용할 수 있습니다 .

  1. NPM을 사용하여 연결 및 제공 정적 설치

    $ npm install connect serve-static
  2. 이 컨텐츠로 server.js 파일을 작성하십시오.

    var connect = require('connect');
    var serveStatic = require('serve-static');
    
    connect()
        .use(serveStatic(__dirname))
        .listen(8080, () => console.log('Server running on 8080...'));
  3. Node.js로 실행

    $ node server.js

이제 갈 수 있습니다 http://localhost:8080/yourfile.html


24
교육상의 이유로 기존 라이브러리를 사용하지 않는 것이 좋았지 만 Express를 사용하는 것이 하위 버전 인 Connect보다 더 나은 조언이라고 생각합니다.
idophir

135
정적 파일을 제공하는 Express의 일부는 연결이므로 정적 파일을 제공하기 위해 Express를 사용해야하는 이유를 알 수 없습니다. 그러나 네, Express도 그 일을 할 것입니다.
지안 마르코 게 라르 디

7
훌륭한 조언. 위의 단계는 내 목적을 위해 잘 작동했습니다. 지안 (Gian) 덕분에 Connect, expressjs.com 에 구축 된 Express에 대한 링크는 다음과 같습니다. Express를 사용하는 방법은 다음과 같습니다. expressjs.com/guide.html
Jack Stone

10
나를 위해 작동하지 않아 결과 /test.html을 얻을 수 없습니다. __dirname을 디렉토리 이름으로 바꿔야합니까?
Timo

3
이제 connect가 버전 3으로 변경되었습니다. 따라서 miqid에 설명 된대로 serve-static을 사용해야합니다. connect v3에 대한 전체 코드로 다른 답변을 게시했습니다.
tomet

160

요점을 확인하십시오 . 참고로 여기에서 재현하고 있지만 요점은 정기적으로 업데이트되었습니다.

Node.JS 정적 파일 웹 서버 임의의 디렉토리에서 서버를 시작하려면 경로에 넣으십시오 (선택적 포트 인수 사용).

var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    port = process.argv[2] || 8888;

http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      response.writeHead(200);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));

console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");

최신 정보

요지는 CSS 및 JS 파일을 처리합니다. 나는 그것을 직접 사용했습니다. "이진"모드에서 읽기 / 쓰기를 사용하는 것은 문제가되지 않습니다. 이는 파일이 파일 라이브러리에 의해 텍스트로 해석되지 않고 응답에 반환 된 컨텐츠 유형과 관련이 없음을 의미합니다.

코드의 문제점은 항상 "text / plain"컨텐츠 유형을 반환한다는 것입니다. 위의 코드는 컨텐츠 유형을 반환하지 않지만 HTML, CSS 및 JS에만 사용하는 경우 브라우저에서 해당 유형을 유추 할 수 있습니다. 내용 유형이 잘못된 유형보다 낫습니다.

일반적으로 컨텐츠 유형은 웹 서버의 구성입니다. 그래서이 해결되지 않을 경우 미안 해요 당신의 문제를, 그러나 그것은 단순한 개발 서버로 나를 위해 일을하고 다른 사람들을 도와 줄 알았는데. 응답에 올바른 컨텐츠 유형이 필요한 경우, joeytwiddle이있는 것으로 명시 적으로 정의하거나 기본값이 적절한 Connect와 같은 라이브러리를 사용해야합니다. 이것에 대한 좋은 점은 간단하고 독립적입니다 (의존성 없음).

그러나 나는 당신의 문제를 느낍니다. 결합 된 솔루션은 다음과 같습니다.

var http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs")
    port = process.argv[2] || 8888;

http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  var contentTypesByExtension = {
    '.html': "text/html",
    '.css':  "text/css",
    '.js':   "text/javascript"
  };

  fs.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      var headers = {};
      var contentType = contentTypesByExtension[path.extname(filename)];
      if (contentType) headers["Content-Type"] = contentType;
      response.writeHead(200, headers);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));

console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");

3
이것은 실제로 "문제"를 해결하지 않습니다. index.html을 이진 파일로 반환하고 CSS와 js를 처리하지 않습니다.
idophir

4
CSS와 js를 처리합니다. index.html을 이진 파일로 반환하지 않습니다. 어떤 형식 으로든 디스크에서 데이터를 복사하기 만하면됩니다. 자세한 내용은 업데이트를 참조하십시오.
Jonathan Tran

코드의 한 가지 문제는 대소 문자를 구분하며 특정 파일의 유닉스에서는 404입니다.
Pradeep

2
"path.exists 및 path.existsSync는 더 이상 사용되지 않습니다. fs.exists 및 fs.existsSync를 사용하십시오." stackoverflow.com/a/5008295/259
David Sykes

3
참고 fs.exists()또한 지금은 사용되지 않습니다. fs.stat()경쟁 조건을 만드는 대신 오류를 잡아라 .
Matt

100

당신은 표현이 필요하지 않습니다. 연결할 필요가 없습니다. Node.js는 기본적으로 http를 수행합니다. 요청에 따라 파일을 반환하기 만하면됩니다.

var http = require('http')
var url = require('url')
var fs = require('fs')

http.createServer(function (request, response) {
    var requestUrl = url.parse(request.url)    
    response.writeHead(200)
    fs.createReadStream(requestUrl.pathname).pipe(response)  // do NOT use fs's sync methods ANYWHERE on production (e.g readFileSync) 
}).listen(9615)    

요청이 기본 디렉토리 아래의 파일에 액세스 할 수 없게하고 적절한 오류 처리를 수행하는보다 완전한 예 :

var http = require('http')
var url = require('url')
var fs = require('fs')
var path = require('path')
var baseDirectory = __dirname   // or whatever base directory you want

var port = 9615

http.createServer(function (request, response) {
    try {
        var requestUrl = url.parse(request.url)

        // need to use path.normalize so people can't access directories underneath baseDirectory
        var fsPath = baseDirectory+path.normalize(requestUrl.pathname)

        var fileStream = fs.createReadStream(fsPath)
        fileStream.pipe(response)
        fileStream.on('open', function() {
             response.writeHead(200)
        })
        fileStream.on('error',function(e) {
             response.writeHead(404)     // assume the file doesn't exist
             response.end()
        })
   } catch(e) {
        response.writeHead(500)
        response.end()     // end the response so browsers don't hang
        console.log(e.stack)
   }
}).listen(port)

console.log("listening on port "+port)

3
내가 실수하지 않으면이 솔루션은 인코딩 유형을 처리하지 않으므로 HTML 페이지와 이미지에 대한 요청은 동일한 인코딩을 얻습니다. 그렇지 않습니까?
idophir

2
@idophir 대부분의 인코딩은 중요하지 않으며, 브라우저는 사용 된 html 태그 또는 기타 정보를 기반으로 인코딩을 유추하거나 실제로는 잘 추측합니다. 위에서 언급 한 것처럼 MIME 유형이 잘못된 유형보다 낫습니다. 확실히 node-mime과 같은 것을 사용하여 파일의 MIME 유형을 파악할 수 있지만 웹을 완벽하게 준수하는 http 서버는이 질문의 범위를 벗어납니다.
BT

1
@Rooster 특별한 것이 필요하지 않습니다 node thisfile.js. A. 신호에 의해 닫히거나 B. 어떤 미친 오류로 인해 프로그램이 종료 될 때까지 새로운 연결을 듣고 새로운 결과를 반환합니다.
BT

1
@Rooster rephub.com/Unitech/pm2에서 또 다른 평판을 얻는 데 몬스터가 있습니다.
Traveling Man

1
이 답변이 가장 마음에 들지만 두 가지 문제가 있습니다. 1) 404를 반환해야 할 때 200을 반환합니다. 'open'콜백 내에서 writeHead (200)를 호출하도록 수정하십시오. 2) 오류가 있으면 소켓이 열린 상태로 유지됩니다. 'error'콜백에서 response.destroy () 호출합니다.
Paul Brannan

70

나는 당신이 지금 놓친 부분은 당신이 보내는 것입니다.

Content-Type: text/plain

웹 브라우저가 HTML을 렌더링하도록하려면 다음과 같이 변경해야합니다.

Content-Type: text/html

빠른 답변 감사합니다. CSS가없는 페이지가로드됩니다. CSS와 JS가로드 된 표준 HTML 페이지를 어떻게 얻을 수 있습니까?
idophir

20
해당 서버 확장을 시작해야합니다. 지금은 index.html을 제공하는 방법 만 알고 있습니다. 이제 적절한 MIME 유형으로 foo.css 및 foo.js를 제공하는 방법을 가르쳐야합니다.
clee

1
정적 파일을 제공하지 않으려면 CSS를 <style>태그에 넣을 수 있습니다 .
Keith

1
9 년 후, 이것은 실제로 정답으로 받아 들여 져야합니다.
rooch84

46

1 단계 (명령 프롬프트 [내가 당신의 폴더에 CD를 바랍니다]) : npm install express

2 단계 : 파일 server.js 작성

var fs = require("fs");
var host = "127.0.0.1";
var port = 1337;
var express = require("express");

var app = express();
app.use(express.static(__dirname + "/public")); //use static files in ROOT/public folder

app.get("/", function(request, response){ //root dir
    response.send("Hello!!");
});

app.listen(port, host);

WATCHFILE을 추가하거나 nodemon을 사용해야합니다. 위의 코드는 간단한 연결 서버 전용입니다.

3 단계 : node server.js또는nodemon server.js

호스트 간단한 HTTP 서버를 원한다면 더 쉬운 방법이 있습니다. npm install -g http-server

디렉토리를 열고 입력하십시오 http-server

https://www.npmjs.org/package/http-server


@STEEL, 노드 서버를 자동으로 시작할 수있는 방법이 있습니까? 디렉토리 경로로 이동하지 않고 nodeserver를 입력하면 시작됩니다. IIS와 같은 노드 서버를 시작하고 싶습니다. 당신은 저에게 말할 수 있습니까
Vinoth

@Vinoth 네 가지 방법이 있습니다. 당신의 정확한 목적이나 목표는 무엇
STEEL

@steel 나는 명령 promt에 노드 서버를주지 않고 자동으로 서버를 시작하고 싶습니다. 이것은 나의 요구 사항입니다 당신이 몇 가지 예를 말해 줄 수 있습니까
Vinoth

브라우저에서 한 번의 클릭으로 터미널 명령을 실행할 수있는 ThoughtWorks GO와 같은 일부 도구를 사용해야합니다.
STEEL

32

빠른 길 :

var express = require('express');
var app = express();
app.use('/', express.static(__dirname + '/../public')); // ← adjust
app.listen(3000, function() { console.log('listening'); });

너의 길:

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

http.createServer(function (req, res) {
    console.dir(req.url);

    // will get you  '/' or 'index.html' or 'css/styles.css' ...
    // • you need to isolate extension
    // • have a small mimetype lookup array/object
    // • only there and then reading the file
    // •  delivering it after setting the right content type

    res.writeHead(200, {'Content-Type': 'text/html'});

    res.end('ok');
}).listen(3001);

19

switch 문을 다루지 않고 사전에서 내용 유형을 조회하는 것이 더 좋다고 생각합니다.

var contentTypesByExtension = {
    'html': "text/html",
    'js':   "text/javascript"
};

...

    var contentType = contentTypesByExtension[fileExtension] || 'text/plain';

예. Eric B. Sowell이 사용하는 "스위치"솔루션보다 훨씬 우아해 보입니다 (선택된 답변 참조). 감사.
idophir

이 답변은 문맥에서 완전히 벗어난 것입니다 ...이 댓글 내에서이 링크를 가리 킵니다 -stackoverflow.com/questions/6084360/… (예, 인터넷이 깨 졌음)
Mars Robertson

15

이것은 기본적으로 연결 버전 3에 허용되는 답변의 업데이트 버전입니다.

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

var app = connect();

app.use(serveStatic(__dirname, {'index': ['index.html']}));
app.listen(3000);

index.html이 기본값으로 제공되도록 기본 옵션을 추가했습니다.


13

간단한 서버를 실행하기 위해 NPM 모듈을 사용할 필요가 없습니다 . 노드 용 " NPM Free Server " 라는 매우 작은 라이브러리가 있습니다 .

50 줄의 코드, 파일이나 폴더를 요청하면 출력되고 작동하지 않으면 빨간색 또는 녹색으로 표시됩니다. 1KB 미만 (최소화)


탁월한 선택. html, css, js 및 이미지를 제공합니다. 디버깅에 좋습니다. server.js를 위해이 코드를 그대로 사용하십시오.
pollaris

2
더 많은 투표를 추가 할 수 있기를 바랍니다! 대단해! dist 폴더 var filename = path.join(process.cwd() + '/dist/', uri); 에서 서버를 약간 변경 했습니다 . 나는에 코드를 넣어 그와server.js 단지 작동 내가 입력 할 때npm start
존 헨켈

서비스로 실행하는 방법이므로 명령 프롬프트를 닫아도 사용할 수 있습니다. 그렇지 않으면 이런 종류의 도구를 제공하는 도구가 있습니까?
Sandeep sandy

13

PC에 노드가 설치되어 있다면 아마도 NPM이 있고 NodeJS가 필요하지 않은 경우 서브 패키지를 사용할 수 있습니다 .

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

npm install -g serve

2-정적 폴더를 제공하십시오.

serve <path> 
d:> serve d:\StaticSite

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

http://localhost:3000

서비스로 실행하는 방법이므로 명령 프롬프트를 닫아도 사용할 수 있습니다. 그렇지 않으면 이런 종류의 도구를 제공하는 도구가 있습니까?
Sandeep sandy

이것이 정답입니다. 가장 쉬우 며 즉시 사용할 수 있기 때문입니다. 따라서 경로없이 서빙을 실행하면 현재 폴더 (이전에 CD를 넣은 폴더)에서 서버가 실행됩니다.
Игор Рајачић

9

npm에서 유용한 라이브러리를 찾았습니다. mime ( npm install mime또는 https://github.com/broofa/node-mime ) 이라고 하며 파일의 MIME 유형을 결정할 수 있습니다. 다음은 그것을 사용하여 작성한 웹 서버의 예입니다.

var mime = require("mime"),http = require("http"),fs = require("fs");
http.createServer(function (req, resp) {
path  = unescape(__dirname + req.url)
var code = 200
 if(fs.existsSync(path)) {
    if(fs.lstatSync(path).isDirectory()) {
        if(fs.existsSync(path+"index.html")) {
        path += "index.html"
        } else {
            code = 403
            resp.writeHead(code, {"Content-Type": "text/plain"});
            resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
        }
    }
    resp.writeHead(code, {"Content-Type": mime.lookup(path)})
    fs.readFile(path, function (e, r) {
    resp.end(r);

})
} else {
    code = 404
    resp.writeHead(code, {"Content-Type":"text/plain"});
    resp.end(code+" "+http.STATUS_CODES[code]+" "+req.url);
}
console.log("GET "+code+" "+http.STATUS_CODES[code]+" "+req.url)
}).listen(9000,"localhost");
console.log("Listening at http://localhost:9000")

이것은 일반 텍스트 또는 이미지 파일을 제공합니다.

개발자 노트

여기 내가 얻은 결과의 예가 있습니다.

Listening at http://localhost:9000
GET 200 OK /cloud
GET 404 Not Found /cloud/favicon.ico
GET 200 OK /cloud/icon.png
GET 200 OK /
GET 200 OK /501.png
GET 200 OK /cloud/manifest.json
GET 200 OK /config.log
GET 200 OK /export1.png
GET 200 OK /Chrome3DGlasses.pdf
GET 200 OK /cloud
GET 200 OK /-1
GET 200 OK /Delta-Vs_for_inner_Solar_System.svg

통지 unescape경로 건설 기능. 공백과 인코딩 된 문자가있는 파일 이름을 허용합니다.


8

편집하다:

Node.js 샘플 앱 Node Chat 에는 원하는 기능이 있습니다.
여기에는 README.textfile
3이 있습니다. 단계는 당신이 찾고있는 것입니다.

1 단계

  • 포트 8002에서 hello world로 응답하는 서버를 만듭니다.

2 단계

  • index.html을 만들어서 제공

step3

  • util.js 소개
  • 정적 파일이 제공되도록 논리를 변경하십시오.
  • 파일을 찾을 수없는 경우 404 표시

step4

  • jquery-1.4.2.js 추가
  • client.js 추가
  • 사용자에게 별명을 묻도록 index.html 변경

여기는 server.js입니다

여기 util.js가 있습니다


5
상관 없어요 index.html 만 있습니다. html + css + js를로드하고 싶습니다. 감사!
idophir

16
.readFileSync콜백의 경우 -1입니다 . node.js에서는 비 차단 IO를 사용합니다. Sync명령을 권장하지 마십시오 .
Raynos

@krmby 님, 도와 주셔서 감사합니다. 나는 이것에 정말로 새로운 것입니다. server.js와 util.js를 모두 다운로드했습니다. "node server.js"를 실행하고 브라우저를 사용하여 페이지에 액세스하려고하면 다음 오류가 발생합니다. TypeError : Object # <ServerResponse>에는 /var/www/hppy-site/util.js에 'close'메서드가 없습니다. : 67 : 8 /var/www/hppy-site/util.js:56:4 [object Object]. <anonymous> (fs.js : 107 : 5) [object Object] .emit (events.js 랩퍼 (fs.js : 245 : 17)에서 afterRead (fs.js : 970 : 12)에 어떤 아이디어가 있습니까? BTW-프로젝트를 다운로드하여 실행할 때도 마찬가지입니다.
idophir

1
죄송합니다. 새 버전을 사용하고있었습니다. res.close ()를 res.end ()로 교체
idophir

8

내가하는 방법은 먼저 모든 설치 노드 정적 서버를 통해

npm install node-static -g

그런 다음 html 파일이 포함 된 디렉토리로 이동하여로 정적 서버를 시작하십시오 static.

브라우저로 이동하여을 입력하십시오 localhost:8080/"yourHtmlFile".


1
하나의 라이너를 능가하는 것은 없습니다. 고마워!
AndroidDev

서비스로 실행하는 방법이므로 명령 프롬프트를 닫아도 사용할 수 있습니다. 그렇지 않으면 이런 종류의 도구를 제공하는 도구가 있습니까?
Sandeep sandy

7
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    // change the to 'text/plain' to 'text/html' it will work as your index page
    res.end(index);
}).listen(9615);

나는 당신이 이것을 찾는 곳을 생각합니다. index.html에서 일반적인 HTML 코드로 작성하십시오.

<html>
    <h1>Hello world</h1>
</html>

7

기본적으로 허용 된 답변을 복사하지만 js 파일을 만들지 마십시오.

$ node
> var connect = require('connect'); connect().use(static('.')).listen(8000);

매우 편리하다는 것을 알았습니다.

최신 정보

최신 버전의 Express에서 serve-static은 별도의 미들웨어가되었습니다. 이것을 사용하여 봉사하십시오 :

require('http').createServer(require('serve-static')('.')).listen(3000)

serve-static먼저 설치하십시오 .


6

w3schools에서

요청 된 파일을 제공하기 위해 노드 서버를 작성하는 것은 매우 쉽습니다. 패키지를 설치할 필요가 없습니다.

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

http.createServer(function (req, res) {
  var q = url.parse(req.url, true);
  var filename = "." + q.pathname;
  fs.readFile(filename, function(err, data) {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }  
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);

http : // localhost : 8080 / file.html

디스크에서 file.html을 제공합니다



5

아래 코드를 사용하여 URL에 언급 된 파일이 없으면 기본 HTML 파일을 렌더링하는 간단한 웹 서버를 시작합니다.

var http = require('http'),
fs = require('fs'),
url = require('url'),
rootFolder = '/views/',
defaultFileName = '/views/5 Tips on improving Programming Logic   Geek Files.htm';


http.createServer(function(req, res){

    var fileName = url.parse(req.url).pathname;
    // If no file name in Url, use default file name
    fileName = (fileName == "/") ? defaultFileName : rootFolder + fileName;

    fs.readFile(__dirname + decodeURIComponent(fileName), 'binary',function(err, content){
        if (content != null && content != '' ){
            res.writeHead(200,{'Content-Length':content.length});
            res.write(content);
        }
        res.end();
    });

}).listen(8800);

모든 html 컨텐츠와 함께 모든 js, css 및 이미지 파일을 렌더링합니다.

성명서에 동의하십시오 " 콘텐츠 유형이 잘못된 유형보다 낫습니다 "


5

이것이 정확히 원하는 것인지 확실하지 않지만 변경을 시도 할 수 있습니다.

{'Content-Type': 'text/plain'}

이에:

{'Content-Type': 'text/html'}

브라우저 클라이언트는 파일을 일반 텍스트 대신 html로 표시합니다.


1
이 기존 답변 과 동일하지 않습니까?
Pang

4
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'html'});
res.end(index);
}).listen(9615);

//Just Change The CONTENT TYPE to 'html'

6
Content-Type해야 text/html그것은 그런 식으로 정의되어, : Content-Type := type "/" subtype *[";" parameter].
t.niese

1
js 인 경우에도이 폴더에있는 모든 파일을 html 유형으로 바꾸는 것 같습니다.
ahnbizcad

위대한 작품 ....
헤로인 체리

4

좀 더 장황한 표현 4.x 버전이지만 디렉토리 목록, 압축, 캐싱을 제공하고 최소한의 행으로 로깅을 요청합니다.

var express = require('express');
var compress = require('compression');
var directory = require('serve-index');
var morgan = require('morgan'); //logging for express

var app = express();

var oneDay = 86400000;

app.use(compress());
app.use(morgan());
app.use(express.static('filesdir', { maxAge: oneDay }));
app.use(directory('filesdir', {'icons': true}))

app.listen(process.env.PORT || 8000);

console.log("Ready To serve files !")

4

여기에 복잡한 답변이 많이 있습니다. nodeJS 파일 / 데이터베이스를 처리하지 않고 질문에 제안 된대로 정적 html / css / js / images를 제공하려면 pushstate-server 모듈 또는 이와 유사한 것을 설치하십시오 .

다음은 미니 사이트를 만들고 시작하는 "하나의 라이너"입니다. 터미널의 전체 블록을 적절한 디렉토리에 붙여 넣기 만하면됩니다.

mkdir mysite; \
cd mysite; \
npm install pushstate-server --save; \
mkdir app; \
touch app/index.html; \
echo '<h1>Hello World</h1>' > app/index.html; \
touch server.js; \
echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './app' });" > server.js; \
node server.js

브라우저를 열고 http : // localhost : 3000으로 이동하십시오 . 끝난.

서버는 appdir을 루트로 사용하여 파일을 제공합니다. 추가 자산을 추가하려면 해당 디렉토리 안에 자산을 넣으십시오.


2
이미 스태틱이있는 경우 다음을 사용할 수 있습니다.npm install pushstate-server --save; touch server.js; echo "var server = require('pushstate-server');server.start({ port: 3000, directory: './' });" > server.js; node server.js
Swivel

4

간단한 몇 가지 훌륭한 솔루션이 이미 있습니다 nodejs server. live-reloading파일을 변경할 때 필요한 경우 한 가지 더 해결책이 있습니다 .

npm install lite-server -g

디렉토리를 탐색하고

lite-server

라이브 리로딩으로 브라우저가 열립니다.


4

Express 함수 sendFile은 정확히 필요한 기능을 수행하며, 노드에서 웹 서버 기능을 원하므로 express가 자연스럽게 선택되고 정적 파일을 제공하는 것이 쉬워집니다.

res.sendFile('/path_to_your/index.html')

더 많은 것을 읽으십시오 : https://expressjs.com/en/api.html#res.sendFile

노드 용 고속 웹 서버를 사용한 작은 예 :

var express = require('express');
var app = express();
var path = require('path');

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.listen(8080);

이것을 실행하고 http : // localhost : 8080으로 하십시오.

이를 확장하여 CSS 및 이미지와 같은 정적 파일을 제공 할 수 있도록하는 또 다른 예는 다음과 같습니다.

var express = require('express');
var app = express();
var path = require('path');

app.use(express.static(__dirname + '/css'));

app.get('/', function(req, res) {
    res.sendFile(path.join(__dirname + '/index.html'));
});

app.listen(8080);

따라서 css라는 하위 폴더를 만들고 정적 내용을 넣으면 index.html에서 다음과 같이 쉽게 참조 할 수 있습니다.

<link type="text/css" rel="stylesheet" href="/css/style.css" />

href에서 상대 경로를 확인하십시오!

짜잔!


3

위의 답변 대부분은 내용이 제공되는 방식을 매우 잘 설명합니다. 내가 추가로보고있는 것은 디렉토리의 다른 내용을 찾아 볼 수 있도록 디렉토리 목록이었습니다. 추가 독자를위한 솔루션은 다음과 같습니다.

'use strict';

var finalhandler = require('finalhandler');
var http = require('http');
var serveIndex = require('serve-index');
var serveStatic = require('serve-static');
var appRootDir = require('app-root-dir').get();
var log = require(appRootDir + '/log/bunyan.js');

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

// Serve directory indexes for reports folder (with icons)
var index = serveIndex('reports/', {'icons': true});

// Serve up files under the folder
var serve = serveStatic('reports/');

// Create server
var server = http.createServer(function onRequest(req, res){
    var done = finalhandler(req, res);
    serve(req, res, function onNext(err) {
    if (err)
        return done(err);
    index(req, res, done);
    })
});


server.listen(PORT, log.info('Server listening on: ', PORT));

2

이것은 웹 페이지를 빠르게 보는 데 사용하는 가장 빠른 솔루션 중 하나입니다.

sudo npm install ripple-emulator -g

그런 다음 html 파일의 디렉토리를 입력하고 실행하십시오.

ripple emulate

기기를 Nexus 7 가로로 변경합니다.


5
Nexus 7과 함께 할 일은 무엇입니까?
waeltken

2

내가 만난 더 간단한 버전은 다음과 같습니다. 교육 목적으로 추상 라이브러리를 사용하지 않기 때문에 가장 좋습니다.

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

var mimeTypes = {
  "html": "text/html",
  "mp3":"audio/mpeg",
  "mp4":"video/mp4",
  "jpeg": "image/jpeg",
  "jpg": "image/jpeg",
  "png": "image/png",
  "js": "text/javascript",
  "css": "text/css"};

http.createServer(function(req, res) {
    var uri = url.parse(req.url).pathname;
    var filename = path.join(process.cwd(), uri);
    fs.exists(filename, function(exists) {
        if(!exists) {
            console.log("not exists: " + filename);
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write('404 Not Found\n');
            res.end();
            return;
        }
        var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
        res.writeHead(200, {'Content-Type':mimeType});

        var fileStream = fs.createReadStream(filename);
        fileStream.pipe(res);

    }); //end path.exists
}).listen(1337);

이제 브라우저로 이동하여 다음을 엽니 다.

http://127.0.0.1/image.jpg

다음은 image.jpg이 파일과 같은 디렉토리에 있어야합니다. 희망이 누군가에게 도움이되기를 바랍니다 :)


파일 이름에서 MIME 유형을 신성하게해서는 안됩니다.
mwieczorek

참고 : fs.exists ()는 더 이상 사용되지 않으며 fs.existsSync ()는 직접 대체입니다.
JWAspin

@mwieczorek 어떻게 신성해야합니까? 그가 파일 확장자를 분리 한 것을 놓쳤습니까?
James Newton

사용하고 싶을 수도 있습니다 : let mimeType = mimeTypes [filename.split ( "."). pop ()] || "응용 프로그램 / octet-stream을"
제임스 뉴턴

1

또한 SugoiJS를 추천 할 수 있습니다. 설정이 매우 쉽고 빠르게 쓰기 시작하는 옵션이 있으며 훌륭한 기능이 있습니다.

시작하려면 여기를보십시오 : http://demo.sugoijs.com/ , 문서 : https://wiki.sugoijs.com/

요청 처리 데코레이터, 요청 정책 및 권한 부여 정책 데코레이터가 있습니다.

예를 들면 다음과 같습니다.

import {Controller,Response,HttpGet,RequestParam} from "@sugoi/server";

@Controller('/dashboard')
export class CoreController{
    constructor(){}

    @HttpGet("/:role")
    test(@RequestParam('role') role:string,
         @RequestHeader("role") headerRole:string){
        if(role === headerRole )
            return "authorized";
        else{
            throw new Error("unauthorized")
        }
    }
}

1

오늘날 수많은 도서관 선물로 매우 쉽습니다. 여기에 대한 답변은 기능적입니다. 다른 버전을 더 빠르고 간단하게 시작하려면

물론 먼저 node.js를 설치하십시오. 나중:

> # module with zero dependencies
> npm install -g @kawix/core@latest 
> # change /path/to/static with your folder or empty for current
> kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js" /path/to/static

여기에 " https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js " 의 내용 (다운로드 할 필요가 없습니다. 작동 방식을 이해하기 위해 게시했습니다)

// you can use like this:
// kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" /path/to/static
// kwcore "https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" 

// this will download the npm module and make a local cache
import express from 'npm://express@^4.16.4'
import Path from 'path'

var folder= process.argv[2] || "."
folder= Path.resolve(process.cwd(), folder)
console.log("Using folder as public: " + folder)

var app = express() 
app.use(express.static(folder)) 
app.listen(8181)
console.log("Listening on 8181")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.