javascript Express 500 TypeError:无法读取未定义的属性“get”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14685081/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Express 500 TypeError: Cannot read property 'get' of undefined
提问by chiasyan
This example is taken from Node Cookbook, but using Express 3.1.0:
此示例取自 Node Cookbook,但使用 Express 3.1.0:
app.js
应用程序.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
登录.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
登录.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")
ResultLog from terminal
来自终端的结果日志
The error is came from the line: routes = req.app.routes.routes[method];in login.js
错误来自以下行: routes = req.app.routes.routes[method]; 在登录.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];but there is still a minor error.
更新:我改变了routes = req.app.routes .routes[method]; 但仍有一个小错误。
The uservariable could not be found in login.jade(useris 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
索引.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. user through 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. Any properties we pass to the dynamic helper object are pushed to the Jade view as local variables.
由于我们不再使用路由,我们没有机会通过 req.session。用户通过 res.render。但是,我们可以改用动态助手。动态助手可以访问 req 和 res 对象,它们在渲染视图之前被调用。我们传递给动态助手对象的任何属性都作为局部变量推送到 Jade 视图。
Since I can no longer use dynamic helpersin Express 3.*, so in app.jsI have changed to:
由于我不能再在 Express 3.* 中使用动态助手,所以在app.js 中我已更改为:
app.configure(function(){
app.use(function(req, res, next){
res.locals.user = req.session.user;
next();
});
});
回答by Hector Correa
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. For example:
更新:为了将用户信息传递给您的 Jade 视图,您需要在渲染调用中传递此信息。例如:
# Assuming you've got the user information in req.session.user
console.log(req.session.user);
res.render('login', {user: req.session.user});
回答by chiasyan
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
应用程序.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
登录.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();
};