我使用Node.js作为iPhone客户端的后端API服务器.我用Passport.js来验证local strategy.相关代码如下:

// This is in user.js, my user model
UserSchema.static('authenticate', function(username, password, callback) {
    this.findOne({ username: username }, function(err, user) {
        if (err){
            console.log('findOne error occurred');
            return callback(err);
        }
        if (!user){
            return callback(null, false);
        }
        user.verifyPassword(password, function(err, passwordCorrect){
            if (err){
                console.log('verifyPassword error occurred');
                return callback(err);
            }
            if (!passwordCorrect){
                console.log('Wrong password');
                return callback(err, false);
            }
            console.log('User Found, returning user');
            return callback(null, user);
        });
    });
});

// This is in app.js
app.get('/loginfail', function(req, res){
    res.json(403, {message: 'Invalid username/password'});
});

app.post('/login',
    passport.authenticate('local', { failureRedirect: '/loginfail', failureFlash: false }),
    function(req, res) {
       res.redirect('/');
});

现在,我成功地将一个失败的登录重定向到/loginfail,在那里我将一些JSON发送回iPhone客户端.然而,这并没有足够的粒度.我希望能够将适当的错误发送回iPhone客户端,例如:"未找到用户"或"密码错误".用我现有的代码,我看不出这是如何实现的.

I tried to follow the examples for a custom callback on the passport.js site, but I just can't get it to work due to lack of node underst和ing. How could I modify my code so that I'd be able to send back a res.json with an appropriate error code/message?

我现在正在try 这样的事情:

// In app.js
app.post('/login', function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err) { return next(err) }
        if (!user) {
            console.log(info);
            // *** Display message without using flash option
            // re-render the login form with a message
            return res.redirect('/login');
        }
        console.log('got user');
        return res.json(200, {user_id: user._id});
    })(req, res, next);
});

// In user.js
UserSchema.static('authenticate', function(username, password, callback) {
    this.findOne({ username: username }, function(err, user) {
        if (err){
            console.log('findOne error occurred');
            return callback(err);
        }
        if (!user){
            return callback(null, false);
        }
        user.verifyPassword(password, function(err, passwordCorrect){
            if (err){
                return callback(err);
            }
            if (!passwordCorrect){
                return callback(err, false, {message: 'bad password'});
            }
            console.log('User Found, returning user');
            return callback(null, user);
        });
    });
});

但当我试图安慰的时候.日志(log)(信息),它只是说未定义.我不知道如何让这个自定义回调正常工作...任何帮助都将不胜感激!

推荐答案

我相信您的"authenticate"静态调用(在代码中称为"callback")的回调函数接受第三个参数——"info"——您的代码可以提供这个参数.然后,不是传递{failureRedirect:…}对象,传入一个包含3个参数的函数:err、user和info.您在authenticate方法中提供的"信息"将被传递到此回调.

Passport将此场景称为"自定义回调".请参见此处的文档:

Node.js相关问答推荐

在Cypress测试文件中获取项目根路径

查询嵌套数组中的最后一个元素具有特定值的mongoDB集合中的文档

Sveltekit停靠的应用程序找不到从Build导入的包

React原生Nodejs兼容性问题

Redis Typescript 删除方法类型转换

Jest - SyntaxError: 不能在@nestjs/axios 的模块外使用 import 语句

如何为单个 mongo nodejs 驱动程序找到最佳连接池大小

图像存储在后端文件夹中,但使用 multer 和 react.js 在前端找不到

我怎样才能让`git`失败而不是要求提供凭据

类型中缺少属性,该类型是由类实现的接口

提供静态文件到底是什么意思?

在 Node.js 中的两个不同进程之间进行通信

带有加密的nodejs中的SALT和HASH密码

React Native ios build:找不到 node

使用 Webpack 和 font-face 加载字体

Route.get() 需要回调函数,但得到对象未定义

nodeJS - 如何使用 express 创建和读取会话

从 React(同构应用程序)进行 API 调用时出现Access-Control-Allow-Origin问题

当我try 向我的 S3 存储桶 (Node.js) 发送内容时,AWS 缺少凭证

在 Node.js 上使用 Connect 无法获取 /