[英]Express 500 TypeError: Cannot read property 'get' of undefined
此示例來自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'));
});
我已按照以下建議對代碼進行了一些修改:將Express.js 2遷移到3,特別是將app.dynamicHelpers()遷移到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 [method]; 在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中找不到用戶變量( 用戶在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
來自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. *中使用動態助手 ,所以在app.js中我改為:
app.configure(function(){
app.use(function(req, res, next){
res.locals.user = req.session.user;
next();
});
});
您提到的行中有錯誤:
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});
我現在正在運行代碼,但我不確定它是否是正確的方法。 請告知是否應該進行任何糾正。
我修改了
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();
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.