【问题标题】:res.json sending old datares.json 发送旧数据
【发布时间】:2016-10-22 20:02:33
【问题描述】:

您好,我有一个问题,我无法用 express 的 res.json 真正解释。

这是我的 /login 路线:

router.post('/login', function (req, res) {
    if (req.body.user) {
        var newUser = (typeof req.body.user === 'string') ? JSON.parse(req.body.user) : req.body.user;

        User.findOne({ email: newUser.email })
        .exec(function (err, user) {
            if (err) {
                return res.json({ error: true, data: err });
            } else {
                if (user !== undefined && user !== null) {

                    // Check password and generate a token if it exist
                    encrypt.checkHash(newUser.pwd, user.pwd, function (err, isCorrect) {
                        if (err) {
                            return res.json({ error: true, data: err });
                        } else {
                            if (isCorrect != false) {

                                // Generate token and send it
                                Token.generateToken({
                                    _id: user._id, email: user.email,
                                    iat: moment().valueOf(),
                                    exp: moment().add(30, 'minutes').valueOf(),
                                },
                                conf.secret,
                                {},
                                function (err, token) {
                                    if (err) {
                                        return res.json({ error: true, authenticate: false, data: err });
                                    } else {
                                        console.log('Logged');
                                        return res.json({
                                            error: false,
                                            token: token,
                                            authenticate: true,
                                            msg: 'user_connected',
                                        });
                                    }
                                });
                            } else {
                                console.log('Not logged');
                                return res.json({ error: true, authenticate: false, msg: 'user_undefined' });
                            }
                        }
                    });
                } else {
                    return res.json({ error: true, authenticate: false, msg: 'user_undefined' });
               }
           }
       });
   } else {
        return res.json({ error: true, authenticate: false, msg: 'user_empty' });
   }

});

这里是我向该路线提出请求的功能:

userRequest.auth = function (user) {
    console.log('AUTH userRequest ', user);
    $http({
        method: 'POST',
        url: url + '/auth/login',
        dataType: 'application/json',
        data: { user: user },
    }).then(function successCallback(response) {
        $log.warn('user request', response);
        deferred.resolve(response);
    }, function errorCallback(err) {

        deferred.reject(err);
    });

    return deferred.promise;
};

这里是我的 onClick 函数,它启动了这个过程

var promise = userRequest.auth($scope.user);

promise.then(function (response) {
    var data = response.data;
    $log.info('Login RESPONSE ', response);

    if (data.error == false && data.authenticate == true) {
        $log.info('You are logged');
        $scope.notification = setAlertBoxOptions($scope.notification, true, 'alert-success', 'Vous êtes maintenant connecté');
     } else {
         $log.info('Wrong informations');
         $scope.notification = setAlertBoxOptions($scope.notification, true, 'alert-danger', 'Utilisateur inconnue');
     }
 }, function (reason) {

    $log.error(reason);
 });

我的函数的 encrypt.checkHash 回调起作用,并且值 isCorrect 是检查我的密码哈希时的好方法。如果密码正确,则记录“已记录”,如果不正确,则记录“未记录”。

我第一次在这条路线上发出请求时,它通过 res.json 向我发回响应,我得到了预期的数据。

但在第一次请求之后,我收到的数据始终是我在第一次查询时收到的数据。

例如:我第一次发送正确的身份信息并返回给我

{error: false, token: token, authenticate: true, msg: 'user_connected'}

但在那之后,每次我尝试对该路线进行另一个查询时,如果我的标识信息为假,我都会不断收到此 JSON 对象事件。

我不是 Nodejs 方面的专家,我试图替换我所有的

res.json({...})

return res.json({...})

停止执行但结果还是一样。

你能和我分享你的智慧并帮我解决这个案子吗?

【问题讨论】:

  • 执行此操作时服务器发送的 HTTP 状态代码是什么? 200还是别的什么?
  • HTTP 状态码是 200,我刚刚发现为什么数据没有更新,但不知道为什么会有这种行为。它与方法的执行顺序有关。第一次执行时,我的 userRequest.auth 函数首先执行,然后我得到路由代码。但其他时候,路由代码会先执行,然后再执行 userRequest.auth 代码。这是为什么 ?我的 promise 实现有错吗?

标签: angularjs json node.js express


【解决方案1】:

我发现了它发生的原因,在我的 angularJS 工厂中,我只初始化了一次 $q 服务,并在工厂的方法中使用它。像这样:

angular.module('myApp').factory(
    'userRequest',
    ['$log', '$q',
    function ($log, $q) {

        // Initialized wrongly
        var deferred = $q.defer();

        userRequest.auth = function (user) {

            console.log('AUTH userRequest ', user);
            $http({
                method: 'POST',
                url: url + '/auth/login',
                dataType: 'application/json',
                data: { user: user },
            }).then(function successCallback(response) {
                $log.warn('user request', response);
                deferred.resolve(response);
            }, function errorCallback(err) {

                deferred.reject(err);
            });

        return deferred.promise;
    };
}])

代替:

angular.module('myApp').factory(
    'userRequest',
    ['$log', '$q',
    function ($log, $q) {

        userRequest.auth = function (user) {

            // Where to initialize it
            var deferred = $q.defer();

            console.log('AUTH userRequest ', user);
            $http({
                method: 'POST',
                url: url + '/auth/login',
                dataType: 'application/json',
                data: { user: user },
            }).then(function successCallback(response) {
                $log.warn('user request', response);
                deferred.resolve(response);
            }, function errorCallback(err) {

                deferred.reject(err);
            });

        return deferred.promise;
    };
}])

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2019-07-02
    • 2021-06-20
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多