使用express设置基本服务器

Nic*_*ing 1 javascript http node.js express pug

我有一个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)
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

router.js(从index - > server传递的函数路由调用router.js中的路由函数,调用与handle对象中的路径名匹配的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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

***当我去请求localhost:8888时,它试图发出一堆请求.首先它正确地请求"/"然后继续记录所有说"关于路由/ stylesheets/style.css的请求"的事件最终页面加载没有css.我的layout.jade文件中指示的路径名正好是'/stylesheets/style.css'.

为什么路径名要评估到/stylesheets/style.css?我认为节点在后台做了一些事情我并不完全理解它.

如果您需要更多信息,请告诉我.谢谢!

kev*_*vin 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)
Run Code Online (Sandbox Code Playgroud)

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!');
});
Run Code Online (Sandbox Code Playgroud)

最后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
   };
};

//...
Run Code Online (Sandbox Code Playgroud)

转到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')

现在,在考虑将某些内容部署到生产之前,您将不得不尝试并了解有关节点和表达的更多信息,这些网站可能会帮助您:

希望这个微小的tut帮助你.