Использование экспресса для настройки базового сервера

У меня есть приложение node.js, и я застреваю, получая сообщение об ошибке, когда пытаюсь загрузить домашнюю страницу. Я сделаю все возможное, чтобы изложить свою архитектуру ниже. Идет index.js --> server.js --> router.js --> requestHandlers.js.

Я использую комбинацию экспресс (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 (маршрут функции, переданный из индекса -> сервер, который вызывает функцию маршрута в router.js, вызывает 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? Я думаю, что node делает что-то в фоновом режиме, и я не совсем понимаю.

Дайте мне знать, если вам нужна дополнительная информация. Спасибо!


person Nic Meiring    schedule 10.05.2012    source источник


Ответы (2)


Как прокомментировал @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!», это наш обработчик запросов. Если вы посмотрите на терминал, то увидите «пойманный запрос GET/», это наш мидлвар.

Ваши таблицы стилей, javascripts на стороне клиента и т. д. должны находиться в /public. app.use(express.static(__dirname + '/public')) будет обслуживать их.

Допустим, у вас есть /public/stylesheets/all.css, тогда вы можете включить его в свой нефритовый шаблон вот так link(rel='stylesheet', href='/public/stylesheets/all.css')

Теперь вам придется поэкспериментировать и узнать больше об узле и выражении, прежде чем даже думать о развертывании чего-либо в рабочей среде, эти веб-сайты могут вам помочь:

Надеюсь, этот крошечный микро-тут поможет вам.

person kevin    schedule 10.05.2012
comment
спасибо, кевин. Я попытался выделить свою конфигурацию в отдельный модуль, как вы предложили, но у меня все еще возникают те же проблемы. Я проверю эти ссылки. Спасибо! - person Nic Meiring; 11.05.2012
comment
Почему вы используете в коде имя переменной $express вместо простого «express»? - person Erik; 22.05.2012
comment
Это просто соглашение, чтобы избежать конфликта имен. Допустим, вы хотите использовать модуль пути, используя это соглашение, вы можете создать функцию, которая принимает аргумент пути, в этом нет двусмысленности. Это также делает переменные, содержащие зависимости, быстро узнаваемыми и отличительными. Некоторые ребята используют все заглавные буквы, но я думаю, что это плохая идея, мы обычно используем ее для постоянных значений, а модуль не является константой. Кроме того, многие интерфейсные фреймворки используют знак доллара в качестве своего глобального пространства имен, поэтому префикс доллара кажется мне вполне логичным. - person kevin; 24.05.2012

вау, это довольно запутанно, вы можете начать с экспресс-приложения (1), которое может сгенерировать для вас

person TJ Holowaychuk    schedule 10.05.2012
comment
Вероятно, он имеет в виду ./node_modules/express/bin/express --help. - person Aleksei Zabrodskii; 11.05.2012
comment
он пытается перенаправить все мои таблицы стилей и изображения, которые связаны в моих нефритовых файлах - person Nic Meiring; 11.05.2012