简体   繁体   English

express.js中的路由错误

[英]Routing Error in expressjs

I'm trying to learn expressjs, and have been trying to figure out a way to add MVC structure into it. 我正在尝试学习expressjs,并且一直在尝试找出一种向其中添加MVC结构的方法。 For some reason, I get a 404 error when i try to access localhost:3000. 出于某种原因,当我尝试访问localhost:3000时收到404错误。

My directory structure is: 我的目录结构是:

  • App 应用
    • app.js app.js
    • routes.js routes.js
    • controllers 控制器
    • views 意见
    • etc. 等等

App.js: App.js:

mymodule = {

/* initialize 
 * ==============================
 * load dependencies & external node modules, setup engines */ 
initialize: function() {

    // load modules
    this.express = require('express');
    this.path = require('path');
    this.favicon = require('static-favicon');
    this.logger = require('morgan');
    this.cookieParser = require('cookie-parser');
    this.bodyParser = require('body-parser');

    // initialize main express app.
    this.app = this.express();

    // attach view engine to app
    this.app.set('views', this.path.join(__dirname, 'views')); // view files are in /views/
    this.app.set('view engine', 'jade');

    // attach modules to app
    this.app.use(this.favicon());
    this.app.use(this.logger('dev'));
    this.app.use(this.bodyParser.json());
    this.app.use(this.bodyParser.urlencoded());
    this.app.use(this.cookieParser());
    this.app.use(this.express.static(this.path.join(__dirname, 'public'))); // static files are in /public/
},

/* setErrorHandlers
 * ===============================
 * set error handlers for routing */
setErrorHandlers: function() {
    if (this.app == undefined) {    
        console.log("caught an attempt to set error handlers without initializing");
    } else {

        // Catch 404 Error and forward to error handler 
        this.app.use(function(req, res, next) {
            console.log("Caught 404 Error");
            var err = new Error('Not Found');
            err.status = 404;
            next(err);
        });

        // Error Handlers

        // 1) Dev Error Handler. print stack trace
        if (this.app.get('env') === 'development') {
            this.app.use(function(err, req, res, next) {
                res.status(err.status || 500);
                res.render('error', {
                    message: err.message,
                    error: err
                });
            });
        }

        // 2) Production Error Handler

        this.app.use(function(err, req,res, next) {
            res.status(err.status || 500);
            res.render('error', {
                message: err.message,
                error: {}
            });
        });
    }
},

/* setRouters
 * ================================
 * */
setRouters: function() {
    // get all routes 
    this.routes = require('./routes').construct(this.app);

}
}

mymodule.initialize();
mymodule.setErrorHandlers();
mymodule.setRouters();

module.exports = mymodule.app;'

routes.js: routes.js:

var index_controller = require('./controllers/index').controller();

module.exports.construct = function(app) {
    console.log("got here");
    //app.get('/', require('./controllers/index').about);
    //app.get('/', index_controller.index);
    app.get('/', function(req,res) {res.send("sdf");});
}

./controllers/index.js: ./controllers/index.js:

module.exports.controller = function() {
index_action = function(req, res) {
    if (req == undefined) {
        console.log("req undefined!");
    } else {
    console.log(req);
    res.render('index', {title: 'Express'});
    }
}

return {index: index_action};

} }

I put the code on github repo: https://github.com/sjang92/expressjs-mvc/blob/master/controllers/index.js 我将代码放在github仓库上: https : //github.com/sjang92/expressjs-mvc/blob/master/controllers/index.js

Does anyone know why it's happening? 有人知道为什么会这样吗?

Thank you 谢谢

You're adding a normal middleware function that responds to the request before your app.get('/', ..); 您要添加一个普通的中间件函数,该函数在app.get('/', ..);之前响应请求app.get('/', ..); handler has a chance to execute: 处理程序有机会执行:

    this.app.use(function(req, res, next) {
        console.log("Caught 404 Error");
        var err = new Error('Not Found');
        err.status = 404;
        next(err);
    });

You should instead only add this kind of middleware after all of your other routes. 您应该只所有其他路由之后添加这种中间件。 For example: 例如:

mymodule.initialize();
mymodule.setRouters();
mymodule.setErrorHandlers();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM