express.js 中未定义请求
request is undefined in express.js
我正在使用 node.js 4.2.3 和 express.js 4.13.3 部署 Web 应用程序。
我使用 this express 官方支持的 express-session 模块。
我的密码是
**app.js**
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(favicon(__dirname + '/node_modules/static-favicon/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
resave: false,
saveUninitialized: true,
secret:'HeyYouAreWatchingJakeAndAmir'
}));
app.use(express.static(path.join(__dirname, 'public')));
app.set('multimedia', __dirname + '/public/multimedia');
app.use(user());
现在,app.use(user());
使用我通过阅读一本书制作的模块。该模块名为 user.js,这里是
**user.js**
var User = require('../user');
var session = require('express-session');
module.exports = function(req,res,next){
var uid = req.session.uid;
if(!uid) return next();
User.get(uid, "id", function(err, user){
if (err) return next(err);
req.user = res.locals.user = user;
next();
})
}
User
包含一些功能,例如 User.get
并且如果有用户 ID (=uid
) ,则用户登录并将用户传递给会话,因此它可以满足每个请求。
当我点击 npm start
我得到
C:\Program Files (x86)\nodejs\awesome\lib\middleware\user.js:5
var uid = req.session.uid;
^
TypeError: Cannot read property 'session' of undefined
at module.exports (C:\Program Files (x86)\nodejs\awesome\lib\middleware\user
.js:5:15)
所以,req
是未定义的?
我不知道如何进行调试,请帮我解决这个问题。
这本书 "Node.js in Action" 作者是 Mike Cantelon、Marc Harter T.J。 Holowaychuk 和 Nathan Rajlich,© 2014 Manning Publications,第 9.1.2 至 9.1.4 章
谢谢
您需要传递 user
本身而不是调用它。
app.use(user);
您的 app
稍后将能够在处理活动请求时调用它。
req
是 undefined
的原因是,通过包含额外的括号,您将在不带任何参数的情况下调用 user
。
user() // req = undefined, res = undefined, next = undefined
并且,将其 return
值提供给 app.use()
。
app.use(user());
// is the same as...
var _result = user();
app.use(_result);
加入 app.use()
的参数并没有改变这一点。
注意:为什么对于其他中间件(favicon
、logger
等)您必须调用它们是因为它们以不同的方式定义,导出辅助 function
return
是 use
的函数。
如果你有需要,比如想提供options
到user
,你可以类似地定义它。
// user.js
// ...
var defaultOptions = {};
module.exports = function (options) {
options = Object.assign({}, defaultOptions, options);
return function (req, res, next) {
var uid = req.session.uid;
if(!uid) return next();
User.get(uid, "id", function(err, user){
if (err) return next(err);
req.user = res.locals.user = user;
next();
})
};
};
然后,您需要调用 function (options)
以便它为 app.use()
提供 function (req, res, next)
。
app.use(user({ setting: 'value' }));
我正在使用 node.js 4.2.3 和 express.js 4.13.3 部署 Web 应用程序。
我使用 this express 官方支持的 express-session 模块。
我的密码是
**app.js**
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(favicon(__dirname + '/node_modules/static-favicon/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
resave: false,
saveUninitialized: true,
secret:'HeyYouAreWatchingJakeAndAmir'
}));
app.use(express.static(path.join(__dirname, 'public')));
app.set('multimedia', __dirname + '/public/multimedia');
app.use(user());
现在,app.use(user());
使用我通过阅读一本书制作的模块。该模块名为 user.js,这里是
**user.js**
var User = require('../user');
var session = require('express-session');
module.exports = function(req,res,next){
var uid = req.session.uid;
if(!uid) return next();
User.get(uid, "id", function(err, user){
if (err) return next(err);
req.user = res.locals.user = user;
next();
})
}
User
包含一些功能,例如 User.get
并且如果有用户 ID (=uid
) ,则用户登录并将用户传递给会话,因此它可以满足每个请求。
当我点击 npm start
我得到
C:\Program Files (x86)\nodejs\awesome\lib\middleware\user.js:5
var uid = req.session.uid;
^
TypeError: Cannot read property 'session' of undefined
at module.exports (C:\Program Files (x86)\nodejs\awesome\lib\middleware\user
.js:5:15)
所以,req
是未定义的?
我不知道如何进行调试,请帮我解决这个问题。
这本书 "Node.js in Action" 作者是 Mike Cantelon、Marc Harter T.J。 Holowaychuk 和 Nathan Rajlich,© 2014 Manning Publications,第 9.1.2 至 9.1.4 章
谢谢
您需要传递 user
本身而不是调用它。
app.use(user);
您的 app
稍后将能够在处理活动请求时调用它。
req
是 undefined
的原因是,通过包含额外的括号,您将在不带任何参数的情况下调用 user
。
user() // req = undefined, res = undefined, next = undefined
并且,将其 return
值提供给 app.use()
。
app.use(user());
// is the same as...
var _result = user();
app.use(_result);
加入 app.use()
的参数并没有改变这一点。
注意:为什么对于其他中间件(favicon
、logger
等)您必须调用它们是因为它们以不同的方式定义,导出辅助 function
return
是 use
的函数。
如果你有需要,比如想提供options
到user
,你可以类似地定义它。
// user.js
// ...
var defaultOptions = {};
module.exports = function (options) {
options = Object.assign({}, defaultOptions, options);
return function (req, res, next) {
var uid = req.session.uid;
if(!uid) return next();
User.get(uid, "id", function(err, user){
if (err) return next(err);
req.user = res.locals.user = user;
next();
})
};
};
然后,您需要调用 function (options)
以便它为 app.use()
提供 function (req, res, next)
。
app.use(user({ setting: 'value' }));