【问题标题】:How to make auth with callback hell?如何使用回调地狱进行身份验证?
【发布时间】:2017-10-09 07:14:33
【问题描述】:

创建身份验证系统。当用户进行post-查询(router.js)时:

var user = require("../controllers/user");

router.post("/login", function(req, res, next){
    user.login(req, function(result) {
        res.send(result);
    });

文件控制器/user.js:

var mongo = require("./mongo");

exports.login = function (req, callback) {
    var res;
    var login = req.body.login,
        password = req.body.password;

    var user = new mongo.User({
        login: login,
        password: password
    });

    //check if exist user
    user.findOne({
        login: login
    }, function (err, obj) {
        if (err) {
            console.log("user not found -> save");
            user.save(function (err) {
                if (err) {
                    console.log(err);
                } else {
                    callback("OK");
                }
            });
        } else {
            console.log("ELSE");
            if (password == obj["password"]) {
                callback("OK");
            }
        }
    });
}

我希望 user.login 何时完成创建/创建新用户 -> 调用回调并返回结果。

exports.login = function(req, callback){
user.findOne(/...login or sign up new user.../);
callback("Success");
}

所以如果用户授权 ->

user.login(req, function(result) {
        res.send(result); //this executes
    });

这个怎么做?

【问题讨论】:

  • 您也需要添加回调以防出错。所以,让回调接受两个参数(错误,响应)。如果有错误,请致电callback("error msg", null),如果成功则致电callback(null, "OK")。否则代码看起来不错。回调有问题吗?
  • 解决回调地狱的典型方法是开始使用 Promise。会不会有问题?
  • @PhagunBaya 感谢您的回复。我也添加了callback(error, result) 来处理错误。代码不起作用:) 客户端上的 XmlHttpRequest 说500: Internal Server Error。所有工作,除了user.findOne 函数,因为它不调用回调。我认为语法有问题...
  • @Tomalak,我只是不明白为什么需要承诺。知道它们类似于 XmlHttpRequest...是吗?
  • 您是否使用任何 npm 库进行 mongo 交互?如果是的话,你能指点给我吗?我想看看user.findOne函数的实现。

标签: javascript node.js mongodb asynchronous mongoose


【解决方案1】:

主要问题在于语法,当我尝试使用user.findOne() 查找用户时。 取而代之的是user.findOne() 我使用mongo.User.findOne()

 //mongo.User because I required a mongo.js, where connect to db
// where I had a User model
           mongo.User.findOne({ login: login }, function(err, user){
                if(err){
                    reject(err);
                } else {
                    if(user) {
                        if(password == user["password"]) {
                            resolve("Login success.");
                        }
                    } else {
                        console.log("new user creating...");
                    var newUser = new mongo.User({ login: login, password: password });
                    newUser.save(function(err){
                        if(err) {
                            reject(err);
                            console.log("error with saving");
                        } else {
                            resolve("New user created.")
                        }
                    })
                    }
                }
            });

我也使用了 Promises(如用户 Tomalak 所说),所以在 router.js 中编码:

function userCheck(req){
        return new Promise(function(resolve, reject){
            user.check(req, resolve, reject);
        });
    }

    userCheck(req).then(result => {
        console.log("promise result");
        res.send(result);
    }, error => {
        console.log("promise error");
        res.send(error);
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2016-04-01
    • 2018-08-12
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多