6

提供されたdefualt.htmページの先頭に含まれているコンテンツを「機能」させることができません。HTMLがDOMに読み込まれ、CSSファイルとJSファイルだけが失敗します。より良い代替案はありますか?ソリューションをNodeJS内に保持したいのですが、代わりに、socket.ioとexpressにもオープンにします。

おかげで、以下は私が使用しているものです。

ページを提供するNodeJS

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

fs.readFile(__dirname+'/default.htm', function (err, html) {
    if (err) {
        throw err; 
    }       
    http.createServer(function(request, response) {  
        response.writeHeader(200, {"Content-Type": "text/html"});  
        response.write(html);  
        response.end();  
    }).listen(port.number);
});

Default.htmlページ

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="objects/css/site.css" type="text/css" />
    <script src="objects/js/jquery.min.js" type="text/javascript"></script>
    <script src="objects/js/site.min.js" type="text/javascript"></script>
</head>

<body></body>    

</html>
4

5 に答える 5

4

Javascriptとスタイルが存在しないため、失敗しています。現在のウェブサーバーは、ルートルートという単一のルートのみを送信しています。代わりに、複数のルートの使用を許可する必要があります。ExpressJSはこれをより簡単な方法で行いますが、それがなくても非常に可能です。

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


    var server = http.createServer(function(request, response){
       var header_type = "";
       var data        = "";
       var get = function (uri, callback) {
           // match `request.url` with uri with a regex or something.
           var regex = uri;
           if (request.url.match(regex)) {
               callback();
           }
       };    

       var render = function (resource) {
           // resource = name of resource (i.e. index, site.min, jquery.min)
           fs.readFile( __dirname + "/" + resource, function(err, file) {
              if (err) return false; // Do something with the error....
              header_type = ""; // Do some checking to find out what header type you must send.
              data = file;
           }
       };

       get('/', function(req, res, next) {
           // Send out the index.html
           render('index.html');
           next();
       });


       get('/javascript.min', function(req, res, next) {
          render('javascript.js');
          next();
       });


    });

    server.listen(8080);

これで始めることができるかもしれませんが、next()自分のようなものを実装する必要があります。非常に単純な解決策ですが、機能する解決策です。

http.createServer静的ファイルに応答するための別の解決策は、コールバック内にキャッチャーを作成することです。getメソッド内で、 URIが一致しない場合はpublic、完全なURIがファイルシステム構造に一致するフォルダー内を検索します。

于 2012-11-12T07:20:39.197 に答える
3

ここにも2セントを投入します。

静的ファイルの提供に関する同じ問題を解決した方法は、Paperboyモジュールの使用を開始したことです。これは、現在、Sendモジュールを優先して非推奨になっています。

とにかく、私が解決した方法は、リクエストがGETメソッドに入る前にリクエストを「ハイジャック」し、そのパスを確認することでした。

私が「それを乗っ取る」方法は次のとおりです

self.preProcess(self, request, response);

preProcess: function onRequest(app, request, response){ //DO STUFF }

パスにSTATICFILESディレクトリが含まれている場合は、ファイルの異なるサービングを実行します。それ以外の場合は、「html」パスを使用します。以下は//DO STUFF関数のpreProcess()です

var path = urllib.parse(request.url).pathname;
if(path.indexOf(settings.STATICFILES_DIR) != -1) {
    path = settings.STATICFILES_DIR;
    requestedFile = request.url.substring(request.url.lastIndexOf('/') + 1, request.url.length);
    return resolver.resolveResourceOr404(requestedFile, request, response);
}

これを行うためのより良い方法があるかもしれませんが、これは私がそれをする必要があることの魅力のように機能します。

次に、Paperboyモジュールを使用して、resolver.resolveResourceOr404();関数を使用して次のようにファイルを配信します

resolveResourceOr404 : function (filename, httpRequest, httpResponse) {
    var root = path.join(path.dirname(__filename), '');

    paperboy.deliver(root, httpRequest, httpResponse)
    .error(function(e){
        this.raise500(httpResponse);
    })
    .otherwise(function(){
        this.raise404(httpResponse);
    });
}
于 2012-11-12T07:35:54.460 に答える
3

さて、あなたはdefault.htmすべての要求であなたのファイルを提供しています。したがって、ブラウザが要求するobjects/js/jquery.min.jsと、サーバーはの内容を返しますdefault.htm

Expressまたはその他のフレームワークの使用を実際に検討する必要があります。

于 2012-11-12T07:18:56.257 に答える
3

これを試してみてはどうですか?

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/');
于 2015-03-14T08:34:18.380 に答える
2

この種のものにはExpressを使用する方が良いでしょう。

このような何かが仕事をします。

App.js

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

var app = express();

//Configure Your App and Static Stuff Like Scripts Css
app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views'); // Your view folder
  app.set('view engine', 'jade');  //Use jade as view template engine
  // app.set("view options", {layout: false});  
  // app.engine('html', require('ejs').renderFile); //Use ejs as view template engine
  app.use(express.logger('dev'));

  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(app.router); 
  app.use(require('stylus').middleware(__dirname + '/public')); //Use Stylus as the CSS template engine
  app.use(express.static(path.join(__dirname, 'public'))); //This is the place for your static stuff
});


app.get('/',function(req,res){
  res.render('index.jade',{
    title:"Index Page 
    }
});

インデックスは翡翠のテンプレートページです。静的なhtmlにレンダリングされ、expressで非常にうまく機能します。

すべてのページへのグローバル静的ヘッダーの場合、このようなテンプレートを作成して、任意のページに含めることができます。

static_header.jade

  doctype 5
html
  head
    title= title
    script(src='/javascripts/jquery-1.8.2.min.js')   
    block header 
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    block content

そして最後に、static_headerと独自のスクリプトを備えた独自の動的ヘッダーを使用しているindex.jade。

extends static_header

block header
  script(src='/javascripts/jquery-ui-1.9.1.custom.js')
  script(src='http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/jquery.ui.datepicker-tr.js')
  link(rel='stylesheet',href='/stylesheets/jquery-ui-1.9.1.custom.min.css')
block content
  h1= title

両方のファイルをviewsフォルダーに入れて、ロールする準備をします。

于 2012-11-12T07:19:27.307 に答える