用express来build立一个基本的服务器

我有一个node.js应用程序,当我尝试加载主页时,我遇到了错误消息。 我将尽我所能在下面布置我的架构。 它到index.js – > server.js – > router.js – > requestHandlers.js

我正在使用express(www.expressjs.com)和nodebeginner.org的组合。 对不起,很长的问题..只是想获得尽可能多的信息。

index.js(创build包含path名/请求处理程序信息的句柄对象,调用启动服务器的函数)我从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(启动服务器,这是我要configuration服务器,从URL获取path名,并将其传递到路由模块)

 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 – > server传递的函数路由,它调用router.js中的路由函数,调用与handle对象中的path名相匹配的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对象交互,函数被映射到特定的path名​​,只有当路由器请求这些path名时才被调用)

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

** *当我去请求本地主机:8888它试图做一堆请求。 首先它正确地请求“/”,然后继续通过日志logging“关于路由一个/ stylesheets / style.css的请求”最后页面加载没有CSS。 我的layout.jade文件中指出的path名正是“/stylesheets/style.css”。

为什么path名曾经评估到/stylesheets/style.css? 我认为节点正在做一些背景,我没有完全理解它。

让我知道如果你需要更多的信息。 谢谢!

像@TJHolowaychuk评论说,你真的应该检查手册,并遵循一堆教程。 无论如何,我会尽力帮你一下。

这是一个非常基本的解释。 Express允许您使用子应用程序,因此您可以在不同的文件中拥有不同的应用程序部分。 它也有它自己的路由器。 如果您在处理路由之前需要处理请求和/或响应,您可以创build一个中间件。 如果你想在不同的模块中进行configuration,那么返回一个函数。

所以一个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!”,这是我们的请求处理程序。 如果你看看terminal,你会看到“GET GET GET请求”,这是我们的中间件。

你的样式表,客户端javascripts等应该是/公开的。 app.use(express.static(__dirname + '/public'))将提供这些服务。

假设你有/public/stylesheets/all.css ,那么你可以在你的jade模板中join这个link(rel='stylesheet', href='/public/stylesheets/all.css')

现在,在考虑部署某些产品之前,您必须先试验和了解更多关于节点和expression的信息,这些网站可能会帮助您:

  • howtonode
  • nodetuts

希望这个微小的啧啧可以帮助你。

哇,这是相当混乱,你可能要开始与应用程序快车(1)可以为您生成