请求在 express.js 中未定义

sle*_*vin 1 session request httprequest node.js express

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

我使用这个由 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());
Run Code Online (Sandbox Code Playgroud)

现在,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();
    })
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

那么,req是未定义的吗?

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

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

谢谢

Jon*_*ski 5

你会想要传递user它自己而不是调用它。

app.use(user);
Run Code Online (Sandbox Code Playgroud)

app然后,您可以稍后在处理活动请求时调用它。


原因requndefined,通过包含额外的括号,您可以在user没有任何参数的情况下进行调用。

user() // req = undefined, res = undefined, next = undefined
Run Code Online (Sandbox Code Playgroud)

并且,改为将其return值提供给app.use().

app.use(user());

// is the same as...
var _result = user();
app.use(_result);
Run Code Online (Sandbox Code Playgroud)

参与争论app.use()并不会改变这一点。


注:为什么其他中间件(faviconlogger,等),你必须调用它们是因为他们以不同的方式定义,出口次要function的是returnSA功能use

如果您有需要,例如想要提供optionsuser,您可以类似地定义它。

// 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();
        })
    };
};
Run Code Online (Sandbox Code Playgroud)

然后,你会想调用的function (options),这样它给app.use()function (req, res, next)

app.use(user({ setting: 'value' }));
Run Code Online (Sandbox Code Playgroud)