如何在nodejs中设置运行多个控制器函数

时间:2014-05-03 19:26:55

标签: javascript node.js express

我目前正在研究mean.io的锅炉板代码并实施passwordresetemail。当用户要求使用电子邮件作为参数重置密码时,我创建一个salt(resetid)并向他发送一封电子邮件,其中包含该盐作为重置链接。

我在req中有用户的电子邮件,但想要在进入实际的createemail控制器功能之前附加用户的其他信息(user._id)。我希望在进入createResetPasswordEmailLink之前运行以下函数(userbyemail)

/**
 * Find user by email
 */
exports.userByEmail = function(req, res, next, email) {
    User
        .findOne({
            email: email
        })
        .exec(function(err, user) {
            if (err) return next(err);
            if (!user) return next(new Error('Failed to load User with email ' + email));
            req.user = user;
            next();
        });
};

exports.createResetPasswordEmailLink = function(req, res) {

    var resetPassword = new ResetPassword(req.body);
    resetPassword.resetId = new User().makeSalt();
    **resetPassword.user = req.user._id;  // currently req.user is null**

    console.log(resetPassword.userId);
    resetPassword.save(function(err) {
        if (err) {
            // handle error
        }
        res.status(200);
        return res.redirect('/');
    });
};

以下是我的resetPassword架构

var ResetPasswordSchema = new Schema({
    created: {
        type: Date,
        default: Date.now
    },
    resetId: {
        type: String,
        default: '',
        trim: true
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});

我的路线定义如下

// Setting up the users resetpasswordlink
app.route('/createresetpasswordemaillink')
    .post(users.createResetPasswordEmailLink);

1 个答案:

答案 0 :(得分:0)

我可以用app.params解决这个问题。 App.params正是为这种用法而定义的。

我添加了

// Setting up the userId param
app.param('email', users.userByEmail);

到我的路线,它会在将req传递给常规控制器之前自动执行此功能。

从文档中,App.param被定义为

app.param([name],callback) 映射逻辑以路由参数。例如,当用户出现在路径路径中时,您可以映射用户加载逻辑以自动为路径提供req.user,或者对参数输入执行验证。