【问题标题】:Using express to set up a basic server使用 express 设置基本服务器
【发布时间】:2012-05-19 11:29:15
【问题描述】:

我有一个 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 --> server调用router.js中的route函数,调用与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;

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 正在后台做某事,我不完全理解。

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

【问题讨论】:

    标签: javascript http node.js express pug


    【解决方案1】:

    哇,这很令人困惑,您可能想从可以为您生成的应用程序 express(1) 开始

    【讨论】:

    • 他可能是指./node_modules/express/bin/express --help
    • 它正在尝试路由在我的翡翠文件中链接的所有样式表和图像
    【解决方案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!');
    });
    

    最后配置.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,那么在你的玉模板中你可以像这样包含它link(rel='stylesheet', href='/public/stylesheets/all.css')

    现在,在考虑将某些东西部署到生产环境之前,您必须尝试并了解有关 node 和 express 的更多信息,这些网站可能会对您有所帮助:

    希望这个微型微型图对您有所帮助。

    【讨论】:

    • 谢谢凯文。我尝试按照您的建议将我的配置分离到一个单独的模块中,但仍然遇到同样的问题。我会检查这些链接。谢谢!
    • 为什么在代码中使用“$express”变量名而不是简单的“express”?
    • 这只是避免名称冲突的约定。假设你想使用 path 模块,使用这个约定你可以创建一个带有 path 参数的函数,没有歧义。它还使依赖保持变量可以快速识别和区分。有些人使用全部大写,但我认为这是一个坏主意,我们通常将它用于常量值,而模块不是常量。另外,很多前端框架都使用美元符号作为它们的全局命名空间,所以美元前缀对我来说感觉很一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2016-11-10
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多