774

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 の基本的な静的ファイル サーバー

4

31 に答える 31

230

既製のツールを使用したくない場合は、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);

アップデート

エイドリアンがコメントで述べたように、彼は完全な説明を含む 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 extension. e.g. .js, .doc, ...
  const ext = path.parse(pathname).ext;
  // maps file extension 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 extension
    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}`);
于 2015-03-14T08:12:45.340 に答える
86

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
于 2014-07-04T13:16:14.770 に答える
69

I know it's not Node, but I've used Python's SimpleHTTPServer:

python -m SimpleHTTPServer [port]

It works well and comes with Python.

于 2013-05-02T14:49:01.540 に答える
25

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);

これにより、index.html ファイルが読み込まれます。ロードする html ファイルを指定する場合は、次の構文を使用します。

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

別の場所に配置する場合は、3 行目にパスを設定します。

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

CD でファイルを含むフォルダーに移動し、次のコマンドを使用してコンソールからノードを実行します。

node server.js

localhost:8080 にアクセスします。

于 2016-07-22T08:46:36.843 に答える
9

もう 1 つの非常に優れた静的 Web サーバーがあります: browser-sync です。

ノード パッケージ マネージャーを使用してダウンロードできます。

npm install -g browser-sync

インストール後、cmd プロンプトでプロジェクト フォルダーに移動し、次のコマンドを実行します。

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

ブラウザの現在のフォルダにあるすべてのファイルのケータリングが開始されます。

BrowserSyncから詳細を確認できます

ありがとう。

于 2016-01-12T02:37:22.670 に答える
7

これには NPM serveパッケージを使用できます。NodeJS が必要ない場合は、すばやく簡単に使用できるツールです。

1 - PC にパッケージをインストールします。

npm install -g serve

2 - 静的フォルダーに次のものを提供しますserve <path>

d:> serve d:\StaticSite

静的フォルダーが提供されているポートが表示されます。次のようにホストに移動するだけです。

http://localhost:3000
于 2018-03-21T09:50:09.693 に答える
4

別の単純な Web サーバーを次に示します。

https://www.npmjs.com/package/hostr

インストール

npm install -g hostr

ワーキングディレクターの変更

cd myprojectfolder/

そしてスタート

hostr
于 2015-05-18T20:28:22.613 に答える
4

そのリンクを見てください。

のエクスプレスモジュールをインストールするだけですnode js

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

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

http://hostname/Folder/file.zipのようにファイルにアクセスできます

于 2016-07-20T12:23:06.887 に答える
4

node を使用して静的リソースを提供するパフォーマンスを健全に向上させるには、Buffetを使用することをお勧めします。これは、キャッシング HTTP リバース プロキシとも呼ばれる Web アプリケーション アクセラレータと同様に機能しますが、選択したディレクトリをメモリにロードするだけです。

Buffet は完全にバッファリングされたアプローチを採用しています。アプリの起動時にすべてのファイルがメモリに完全に読み込まれるため、ファイルシステムの焼き付きを感じることはありません。実際には、これは非常に効率的です。アプリの前に Varnish を配置すると、速度が遅くなる可能性さえあります。 

これを codePile サイトで使用したところ、1,000 の同時ユーザー接続負荷の下で 25 のリソースをダウンロードするページで、~700 リクエスト/秒から 4,000 リクエスト/秒以上に増加することがわかりました。

例:

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');

});
于 2015-12-13T22:57:50.447 に答える
4

You can try serve-me

Using it is so easy:

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

Thats all.

PD: The folder served by default is "public".

于 2014-11-14T23:40:52.517 に答える
3

NPM レジストリhttps://npmjs.org/search?q=serverを検索すると、 static-server https://github.com/maelstrom/static-serverが見つかりました

同僚にファイルを送信する必要がありましたが、100 MB の獣を電子メールで送信するのは面倒でしたか? 簡単なサンプル JavaScript アプリケーションを実行したかったのですが、file:/// プロトコルを介して実行する際に問題がありましたか? Samba や FTP など、構成ファイルの編集を必要とするものを設定せずに、メディア ディレクトリを LAN で共有したいとお考えですか? 次に、このファイルサーバーはあなたの人生を少し楽にします.

単純な静的スタッフ サーバーをインストールするには、npm を使用します。

npm install -g static-server

次に、ファイルまたはディレクトリを提供するには、単に実行します

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

フォルダの内容を一覧表示することもできます。

残念ながら、ファイルを提供できませんでした:)

于 2013-05-02T10:56:34.747 に答える
2

まだ NPM にはありませんが、Express 上にシンプルな静的サーバーを構築しました。これにより、フォームの送信を受け入れ、トランザクション電子メール サービス (現在は Sendgrid、Mandrill は今後) を介して電子メールで送信することもできます。

https://github.com/jdr0dn3y/nodejs-StatServe

于 2014-03-31T12:49:10.350 に答える
2

接続を使用した単純な静的サーバー

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 を単純な Web サーバーとして使用するも参照してください。

于 2014-01-23T09:57:33.163 に答える
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
});
于 2015-06-23T13:47:56.383 に答える
1

開発作業には (express 4) https://github.com/appsmatics/simple-httpserver.gitを使用できます

于 2015-08-10T01:23:54.313 に答える
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);

于 2016-02-23T13:27:51.213 に答える