【问题标题】:request is undefined in express.js请求在 express.js 中未定义
【发布时间】:2016-01-09 17:44:25
【问题描述】:

我正在使用 node.js 4.2.3 和 express.js 4.13.3 部署一个 Web 应用程序。

我使用 express 官方支持的this 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 是未定义的?

我不知道如何继续调试,请帮我解决这个问题。

这本书是 Mike Cantelon、Marc Harter、T.J. 的“Node.js in Action”。 Holowaychuk 和 Nathan Rajlich,©2014 Manning Publications,第 9.1.2 至 9.1.4 章

谢谢

【问题讨论】:

    标签: node.js session express request httprequest


    【解决方案1】:

    您需要传递 user 本身而不是调用它。

    app.use(user);
    

    您的app 稍后将能够在处理活动请求时调用它。


    requndefined 的原因是,通过包含额外的括号,您在调用 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() 的参数不会改变这一点。


    注意:为什么对于其他中间件(faviconlogger 等),您必须调用它们,因为它们以不同的方式定义,导出辅助 functionreturns 是一个函数为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' }));
    

    【讨论】:

    • 感谢您的详细回答。在撰写本文时,我认为是模块有问题,而不是我的语法。
    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    相关资源
    最近更新 更多