1

node.js アプリケーションを使用していますが、ホームページを読み込もうとするとエラー メッセージが表示されます。以下に私のアーキテクチャをレイアウトするために最善を尽くします。index.js --> server.js --> router.js --> requestHandlers.js になります。

Express (www.expressjs.com) と nodebeginner.org を組み合わせて使用​​しています。長い質問で申し訳ありません..できるだけ多くの情報を取得したかっただけです.

index.js (パス名/リクエストハンドラー情報を含むハンドル オブジェクトを作成し、関数を呼び出してサーバーを起動します) ここでは router.route から始めて、各ステップに渡します

var server = require("./server");
var router = require('./router');
var requestHandlers = require('./requestHandlers');

// Routes

var handle = {}
handle['/'] = requestHandlers.home;

server.start(router.route, handle)

server.js (サーバーを起動します。ここでサーバーを構成し、URL からパス名を取得し、それをルート モジュールに渡します)

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

function start (route, handle) {
    var onRequest = function(request, res) {
        var pathname = url.parse(request.url).pathname;
        console.log("request for " + pathname + " recieved.");
        route(handle, pathname, res);
    }

    var app = express.createServer(onRequest).listen(8888);
    if (app.configure) {
        console.log('app exists'); //logging correctly
    }
    // Configuration
     app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

    console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); //logs correct with 8888 and development
}

exports.start = start;

router.js (index から渡された関数 route --> router.js で route 関数を呼び出すサーバーは、ハンドル オブジェクトでパス名に一致する requestHandler を呼び出します)

function route (handle, pathname, res) {

    console.log("About to route a request for" + pathname); //About to route a request for/stylesheets/style.css SEE BELOW******* this is the error

if (typeof handle[pathname] === 'function') {
        handle[pathname] (res);
    }
    else {
        console.log('no request handler found for' + pathname);
    }
}

exports.route = route;

requestHandler.js (res/req オブジェクトと対話し、関数は特定のパス名にマップされ、ルーターのおかげでそれらのパス名が要求された場合にのみ呼び出されます)

var home = function(res){
  res.render('index', { title: 'WWYB?' });
  console.log('homepage rendered'); //correctly logs for pathname = '/'
  //click();
};

exports.home = home;

** * localhost:8888 をリクエストしようとすると、大量のリクエストが試行されます。最初は「/」を正しく要求しますが、「/stylesheets/style.css の要求をルーティングしようとしています」というすべてのログを記録し続け、最終的にページは css なしで読み込まれます。私のlayout.jadeファイルに示されているパス名は、まさに「/stylesheets/style.css」です。

パス名が /stylesheets/style.css に評価されるのはなぜですか? ノードはバックグラウンドで何かをしていると思いますが、完全には理解していません。

さらに情報が必要な場合はお知らせください。ありがとう!

4

2 に答える 2

5

@TJHolowaychukがコメントしたように、マニュアルを確認し、一連のチュートリアルに従う必要があります。ともあれ、少しでもお役に立てますように。

は非常に基本的な説明です。Express ではサブアプリケーションを使用できるため、アプリケーションのさまざまな部分をさまざまなファイルに含めることができます。専用のルーターもあります。ルートが処理される前にリクエストやレスポンスを処理する必要がある場合は、ミドルウェアを作成できます。別のモジュールで構成が必要な場合は、そのモジュールで関数を返します。

server.js の例:

var  $express = require('express'),
          app = module.exports = $express.createServer(),
       subapp = require('./subapp'),
    configure = require('./configure');

// Each of our own configure returns a function that will be
// called by app.configure
app.configure(configure.all(app));
app.configure('development', configure.devel(app));
app.configure('production', configure.prod(app));

// Use our sub application
app.use(subapp);

// Now listen
app.listen(3030)

subapp.js :

var $express = require('express'),
    subapp = module.exports = $express.createServer();

// Add a handler for GET / to our sub-application
subapp.get('/', function (req, res) {
   res.end('Hello world!');
});

最後に configure.js :

var $express = require('express');

exports.all = function (app) {
   return function () {
      // Global configurations

      app.use($express.bodyParser());
      app.use($express.methodOverride());
      app.set('views', __dirname + '/views');
      app.set('view engine', 'jade');
      app.use($express.static(__dirname + '/public'));
      //...

      // If you want to do something with/on the request/response
      // you can create a middleware
      app.use(function (req, res, next) {
         console.log('caught request %s %s', req.method, req.path);

         // Don't forget the callback
         next();
      });
   };
};

exports.devel = function (app) {
   return function () {
      // Development configurations
   };
};

//...

localhost:3030お気に入りのブラウザで に移動すると、「Hello world!」と表示されます。これがリクエスト ハンドラです。ターミナルを見ると「caught request GET/」と出てくる、これが弊社のミドルウェアです。

スタイルシート、クライアント側の JavaScript などは /public にある必要があります。app.use(express.static(__dirname + '/public'))これらを提供します。

を持っているとしましょう/public/stylesheets/all.css。次に、jade テンプレートに次のように含めることができます。link(rel='stylesheet', href='/public/stylesheets/all.css')

さて、何かを本番環境にデプロイすることを考える前に、node と express について実験し、さらに学ぶ必要があります。これらの Web サイトが役立つ場合があります。

このtiny-micro-tutがお役に立てば幸いです。

于 2012-05-10T22:01:22.863 に答える
4

これはかなり紛らわしいので、まず、express(1) が生成できるアプリから始めることをお勧めします。

于 2012-05-10T20:34:07.890 に答える