【问题标题】:Express 500 TypeError: Cannot read property 'get' of undefinedExpress 500 TypeError:无法读取未定义的属性“get”
【发布时间】:2013-01-19 01:18:41
【问题描述】:

此示例取自 Node Cookbook,但使用的是 Express 3.1.0:

app.js

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());

  app.use(express.cookieParser('kooBkooCedoN'));
  app.use(express.session());
  app.use(require('./login'));

  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

// --------------------------
// MODIFICATION IS MADE HERE!
// --------------------------
app.configure(function(){
  app.use(function(req, res, next){
    res.locals.user = req.session.user;
    next();
  });
});

app.get('/', routes.index);
app.post('/', routes.index);
app.del('/', routes.index);
app.get('/:page', routes.index);

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

我已按照以下建议对代码进行了一些修改: Migrating Express.js 2 to 3, specifically app.dynamicHelpers() to app.locals.use?

login.js

var users = {'dave' : 'expressrocks'};

module.exports = function (req, res, next) { var method = req.method.toLowerCase(), //cache the method
    user = req.body.user,
    logout = (method === 'delete'),
    login = (method === 'post' && user),
    routes = req.app.routes.routes[method];

  if (!routes) { next(); return; }

  if (login || logout) {
    routes.forEach(function (route) {
      if (!(req.url.match(route.regexp))) {
        console.log(req.url);
        req.method = 'GET';
      }
    }); 
  }
  if (logout) {
    delete req.session.user; 
  }
  if (login) {
    Object.keys(users).forEach(function (name) {
      if (user.name === name && user.pwd === users[name]) {
        req.session.user = {
          name: user.name,
          pwd: user.pwd
        };
      }
    }); 
  }
  if (!req.session.user) { req.url = '/'; } 
  next(); 
};

login.jade

if user
  form(method='post')
    input(name="_method", type="hidden", value="DELETE")
    p Hello #{user.name}!
      a(href='javascript:', onClick='forms[0].submit()') [logout]
else
  p Please log in
  form(method='post')
    fieldset
      legend Login
      p
        label(for="user[name]") Username:
        input(name="user[name]")
      p
        label(for="user[pwd]") Password:
        input(type="password", name="user[pwd]")

      input(type="submit")

结果终端记录

错误来自以下行: routes = req.app.routes.routes[方法];login.js

TypeError: Cannot read property 'get' of undefined
    at Object.module.exports [as handle] (/home/chiasyan/Desktop/login/login.js:8:35)
    at next (/home/chiasyan/Desktop/login/node_modules/express/node_modules/connect/lib/proto.js:199:15)
    at store.get.next (/home/chiasyan/Desktop/login/node_modules/express/node_modules/connect/lib/middleware/session.js:309:9)
    at /home/chiasyan/Desktop/login/node_modules/express/node_modules/connect/lib/middleware/session.js:333:9
    at /home/chiasyan/Desktop/login/node_modules/express/node_modules/connect/lib/middleware/session/memory.js:50:9
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

更新: 我已经更改了 routes = req.app.routes.routes[method]; 但仍然有一个小错误。

login.jade中找不到user变量(userlogin.js中定义过一次em>)

ReferenceError: /home/chiasyan/Desktop/login/views/login.jade:1
  > 1| if user
    2|   form(method='post')
    3|     input(name="_method", type="hidden", value="DELETE")
    4|     p Hello #{user.name}!

user is not defined

引自 Node Cookbook

在 routes/index.js 中,我们现在可以简单地拥有以下代码:

index.js

exports.index = function (req, res) { 
  res.render('index', {title: 'Express'}); 
};

Node Cookbook 的另一句话

由于我们不再使用路由,我们没有机会通过 req.session。用户通过 res.render。但是,我们可以使用一个 而是动态助手。动态助手可以访问 req 和 res 对象,它们在视图被渲染之前被调用。任何属性 我们传递给动态帮助对象被推送到 Jade 视图为 局部变量。

由于我不能再在 Express 3.* 中使用 dynamic helpers,所以在 app.js 中我改为:

app.configure(function(){
  app.use(function(req, res, next){
    res.locals.user = req.session.user;
    next();
  });
});

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    你提到的那一行有错误:

    routes = req.app.routes.routes[method];
    

    你应该使用

    routes = req.app.routes[method];
    

    顺便说一句,您对这段代码的结果进行检查的目的是什么?

    更新:为了将用户信息传递到您的 Jade 视图,您需要在渲染调用中传递此信息。例如:

    # Assuming you've got the user information in req.session.user 
    console.log(req.session.user);
    res.render('login', {user: req.session.user});
    

    【讨论】:

    • 嗨赫克托,谢谢你的回答。我已更改为您提供的解决方案,但仍然存在错误。请参考我在更新部分下的原始帖子。至于结果,是来自终端的日志,我希望能提供更多有关问题的信息。请指教。
    • 能否也包括调用 res.render() 的代码?当你调用渲染时,你应该传递用户作为参数。
    • 嗨赫克托,请再次参考更新部分。 res.render()index.js 中被调用一次。抱歉,这是我的第一个网页代码。
    • 我已经更新了答案,您需要将用户信息传递给视图。
    • Hector,我在更新部分引用了书中的另一句话,表明我们没有机会通过 res 传递 req.session.user .渲染。在您提供解决方案的那一刻,我的代码正在运行(请参阅我的新答案),但不确定它是否正确。请指教。非常感谢您的帮助,我现在更清楚一切是如何连接的了。
    【解决方案2】:

    我现在正在运行代码,但我不确定它是否正确。请告知是否需要更正。

    我修改了

    app.configure(function(){
      app.use(function(req, res, next){
        res.locals.user = req.session.user;
        next();
      });
    });
    

    进入

    app.use(function(req, res, next){
      res.locals.user = req.session.user;
        next();
    });
    

    并将其放在以下行之后

    app.use(require('./login'));
    

    除了 Hector Correa 在这篇文章中给出的答案,这里是更正后的完整工作代码。

    app.js

    var express = require('express')
      , routes = require('./routes')
      , user = require('./routes/user')
      , http = require('http')
      , path = require('path');
    
    var app = express();
    
    app.configure(function(){
      app.set('port', process.env.PORT || 3000);
      app.set('views', __dirname + '/views');
      app.set('view engine', 'jade');
      app.use(express.favicon());
      app.use(express.logger('dev'));
      app.use(express.bodyParser());
      app.use(express.methodOverride());
    
      app.use(express.cookieParser('kooBkooCedoN'));
      app.use(express.session());
      app.use(require('./login'));
    
      app.use(function(req, res, next){
        res.locals.user = req.session.user;
        next();
      });
    
      app.use(app.router);
      app.use(express.static(path.join(__dirname, 'public')));
    });
    
    app.configure('development', function(){
      app.use(express.errorHandler());
    });
    
    app.get('/', routes.index);
    app.post('/', routes.index);
    app.del('/', routes.index);
    app.get('/:page', routes.index);
    
    http.createServer(app).listen(app.get('port'), function(){
      console.log("Express server listening on port " + app.get('port'));
    });
    

    login.js

    var users = {'dave' : 'expressrocks'};
    
    module.exports = function (req, res, next) { var method = req.method.toLowerCase(), //cache the method
        user = req.body.user,
        logout = (method === 'delete'),
        login = (method === 'post' && user),
        routes = req.app.routes[method];
    
      if (!routes) { next(); return; }
    
      if (login || logout) {
        routes.forEach(function (route) {
          if (!(req.url.match(route.regexp))) {
            console.log(req.url);
            req.method = 'GET';
          }
        }); 
      }
      if (logout) {
        delete req.session.user; 
      }
      if (login) {
        Object.keys(users).forEach(function (name) {
          if (user.name === name && user.pwd === users[name]) {
            req.session.user = {
              name: user.name,
              pwd: user.pwd
            };
          }
        }); 
      }
      if (!req.session.user) { req.url = '/'; } 
      next(); 
    };
    

    【讨论】:

      猜你喜欢
      • 2020-05-20
      • 1970-01-01
      • 2020-07-14
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多