简体   繁体   English

Express 500 TypeError:无法读取未定义的属性'get'

[英]Express 500 TypeError: Cannot read property 'get' of undefined

This example is taken from Node Cookbook, but using Express 3.1.0: 此示例来自Node Cookbook,但使用Express 3.1.0:

app.js 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'));
});

I have made some modification to the code as suggested in: Migrating Express.js 2 to 3, specifically app.dynamicHelpers() to app.locals.use? 我已按照以下建议对代码进行了一些修改:将Express.js 2迁移到3,特别是将app.dynamicHelpers()迁移到app.locals.use?

login.js 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 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")

Result Log from terminal 结果 从终端记录

The error is came from the line: routes = req.app.routes.routes[method]; 错误来自以下行: routes = req.app.routes.routes [method]; in login.js 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)

Update: I have changed the routes = req.app.routes .routes [method]; 更新:我更改了routes = req.app.routes .routes [method]; but there is still a minor error. 但仍有一个小错误。

The user variable could not be found in login.jade ( user is defined once in the login.js ) login.jade中找不到用户变量( 用户login.js中定义一次)

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

Quote from Node Cookbook 来自Node Cookbook的报价

In routes/index.js, we can now simply have the following code: 在routes / index.js中,我们现在可以简单地使用以下代码:

index.js index.js

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

Another quote from Node Cookbook Node Cookbook的另一个引用

Since we're no longer using routes, we don't have the opportunity to pass req.session. 由于我们不再使用路线,因此我们没有机会通过req.session。 user through res.render. 用户通过res.render。 However, we can use a dynamic helper instead. 但是,我们可以使用动态助手。 Dynamic helpers have access to the req and res objects, they're called just before a view is rendered. 动态助手可以访问req和res对象,它们在呈现视图之前调用。 Any properties we pass to the dynamic helper object are pushed to the Jade view as local variables. 我们传递给动态助手对象的任何属性都将作为局部变量推送到Jade视图。

Since I can no longer use dynamic helpers in Express 3.*, so in app.js I have changed to: 因为我不能再在Express 3. *中使用动态助手 ,所以在app.js中我改为:

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

There is an error in the line that you mentioned: 您提到的行中有错误:

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

You should use 你应该用

routes = req.app.routes[method];

As an aside, what is the purpose of the check that you do with the result of this code? 另外,您对此代码的结果进行检查的目的是什么?

Update: In order to pass the user information to your Jade view you need to pass this information in the render call. 更新:为了将用户信息传递到您的Jade视图,您需要在渲染调用中传递此信息。 For example: 例如:

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

I have the code running now but I am not sure if it is the correct way. 我现在正在运行代码,但我不确定它是否是正确的方法。 Please advise if anything rectification should be made. 请告知是否应该进行任何纠正。

I modified 我修改了

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

into

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

and placed it right after the following line 并将其放在以下行之后

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

Besides the answer given by Hector Correa in this post, here is the complete working code after the correction. 除了Hector Correa在这篇文章中给出的答案之外,这里是修正后的完整工作代码。

app.js 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 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(); 
};

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

相关问题 Express TypeError:无法读取未定义的属性“ get” - Express TypeError: Cannot read property 'get' of undefined 类型错误:无法读取 Express 上未定义的属性“get” - TypeError: Cannot read property 'get' of undefined on Express Express 500 TypeError:无法读取undefined的属性“image” - Express 500 TypeError: Cannot read property 'image' of undefined 用 FIREBASE 表达我得到 TypeError: Cannot read property 'trim' of undefined - Express with FIREBASE I get TypeError: Cannot read property 'trim' of undefined React Express TypeError:无法读取未定义的属性“ then” - React Express TypeError: Cannot read property 'then' of undefined TypeError:无法读取未定义的属性“推送”-Express - TypeError: Cannot read property 'push' of undefined -Express TypeError:无法读取未定义 Express 的属性“使用” - TypeError: Cannot read property 'use' of undefined Express Tailwind V3 导致类型错误:无法读取未定义的属性“500” - Tailwind V3 causing TypeError: Cannot read property '500' of undefined AngularJS:TypeError:无法读取未定义的属性“ get”? - AngularJS: TypeError: Cannot read property 'get' of undefined? TypeError:无法读取未定义的Angularjs属性'get' - TypeError: Cannot read property 'get' of undefined Angularjs
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM