0

この例は 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)

更新:ルート を変更しました= req.app.routes .routes [メソッド]; しかし、まだ小さなエラーがあります。

user変数がlogin.jadeで見つかりませんでした( userlogin.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();
  });
});
4

2 に答える 2

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});
于 2013-02-04T15:52:27.993 に答える
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'));

この投稿で 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(); 
};
于 2013-02-05T02:06:54.413 に答える