2013-02-04 107 views
0

无法读取属性“得到”这个例子是从节点食谱服用,但使用快递3.1.0:快递500类型错误:未定义

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") 

结果 登录从终端

的误差来自于行: 路由= 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) 

更新: 我已经改变了路由= req.app.routes .routes [方法];但仍有一个小错误。

用户变量不能在login.jade找到

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 

引用来自节点食谱

In routes/index.js, we can now simply have the following code:

用户login.js定义一次)

index.js

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

从节点食谱

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.

另一句名言因为我不能再在应用程序中使用的快递3. * 动态佣工,所以。JS我已经更改为:

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

回答

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}); 
+0

嗨赫,谢谢您的回答。我已更改为您提供的解决方案,但仍存在错误。请参考更新部分下的原始文章。 至于结果,它是来自终端的日志,我希望给出更多的问题信息。请指教。 – chiasyan

+0

你还可以在你调用res.render()的地方加入代码吗?当您调用渲染时,您应该*传递*用户作为参数。 –

+0

嗨Hector,请再次参考更新部分。 _res.render()_在_index.js_中被调用一次。对不起,这是我第一个网页代码。 – chiasyan

1

我有代码正在运行,但我不确定它是否是正确的方式。请告知是否应该进行任何纠正。

我修改

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')); 

而且在这个岗位由赫克托·科雷亚给出的答案之后,这里是完整的修正后的工作代码。

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