Hapi Lab Были обнаружены следующие утечки: lr

Здесь Hapi Lab, почему тест не прошел, когда все тесты пройдены, почему тест не пройден.

В этом новом вопросе, почему я получаю сообщение Обнаружены следующие утечки: lr, даже если в коде нет глобальной переменной var.

Запуск этого простого теста

var Code = require('code');
var Lab = require('lab');
var lab = exports.lab = Lab.script();
var server = require('../../');


lab.experiment('Users', function () {

    lab.test('create joi required', function (done) {

        var options = {
            method: 'POST',
            url: '/api/users',
            payload: {
                lastname: 'Bedini',
                username: 'whisher',
                email: '[email protected]',
                password: 'mysecret'
            }
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(422);
            Code.expect(result.message).to.equal('child "firstname" fails because ["firstname" is required]');
            done();
        });

    });

    lab.test('create', function (done) {

        var options = {
            method: 'POST',
            url: '/api/users',
            payload:{
                firstname: 'Fabio',
                lastname: 'Bedini',
                username: 'whisher',
                email: '[email protected]',
                password: 'mysecret'
            }
        };

        server.inject(options, function(response) {
            var token = response.result.token;
            var payload = options.payload;
            Code.expect(response.statusCode).to.equal(201);
            done();
        });

    });

});

2 теста завершены

Продолжительность теста: 363 мс

Были обнаружены следующие утечки: lr

но я не вижу lr var !

и странно, если я запускаю это

полезная нагрузка.пароль

вместо

полезная нагрузка.пароль

var Code = require('code');
var Lab = require('lab');
var lab = exports.lab = Lab.script();
var server = require('../../');


lab.experiment('Users', function () {

    lab.test('create joi required', function (done) {

        var options = {
            method: 'POST',
            url: '/api/users',
            payload: {
                lastname: 'Bedini',
                username: 'whisher',
                email: '[email protected]',
                password: 'mysecret'
            }
        };

        server.inject(options, function(response) {
            var result = response.result;
            Code.expect(response.statusCode).to.equal(422);
            Code.expect(result.message).to.equal('child "firstname" fails because ["firstname" is required]');
            done();
        });

    });

    lab.test('create', function (done) {

        var options = {
            method: 'POST',
            url: '/api/users',
            payload:{
                firstname: 'Fabio',
                lastname: 'Bedini',
                username: 'whisher',
                email: '[email protected]',
                passdword: 'mysecret'
            }
        };

        server.inject(options, function(response) {
            var token = response.result.token;
            var payload = options.payload;
            Code.expect(response.statusCode).to.equal(201);
            done();
        });

    });

});

у меня есть

1 из 2 тестов не прошел

Продолжительность теста: 73 мс

Утечек глобальных переменных не обнаружено

без предупреждения о lr var.

Так что я не знаю, куда обратиться :(

Можете мне помочь, пожалуйста?

ОБНОВИТЬ

контроллер

'use strict';

/**
 * Module dependencies.
 */
var BcryptUtil = require('../utils/bcrypt');
var JwtUtil = require('../utils/jwt');
var Models = require('../models');
var ReplyUtil = require('../utils/reply');
var  User = Models.users;

exports.create =  function create(request, reply) {

    var params = request.payload;
    params.password = BcryptUtil.generateHash(params.password);
    params.roles =JSON.stringify(['user']);
    User
        .create(params)
        .then(function(user) {
            var token = JwtUtil.getUserToken(user);
            var redisClient = request.server.plugins['hapi-redis'].client;
            redisClient.set('user_'+user.userId, token);
            return reply(ReplyUtil.ok(token)).created('/api/users/' + user.userId);
        })
        .catch(function(err){
            if(err instanceof Models.Sequelize.ValidationError){
       return reply(ReplyUtil.badData(err,params));
    }
    return reply(ReplyUtil.badImplementation(err));
        });

};

exports.findAll = function (request, reply) {

    User
        .findAll({
            order: [['createdAt','DESC']],
            attributes: ['userId', 'firstname', 'lastname', 'username', 'email']
        })
        .then(function(users) {
            return reply(ReplyUtil.ok(users));
        })
        .catch(function(err){
    return reply(ReplyUtil.badImplementation(err));
        });

};

exports.findById = function (request, reply) {

    var userId = request.params.userId;
    User
        .findById(
            userId,
            {
                attributes: ['userId', 'firstname', 'lastname', 'username', 'email']
            })
        .then(function(user) {
            if(!user){
       return reply(ReplyUtil.notFound({userId:userId}));
    }
    return reply(ReplyUtil.ok(user));
        })
        .catch(function(err){
            return reply(ReplyUtil.badImplementation(err));
        });

};

exports.update = function (request, reply) {

    var userId = request.params.userId;
    var params =request.payload;
    User
        .update(params,{
            where: {
       userId: userId
    }
        })
        .then(function(rows) {
            var affectedRows = rows.pop();
    if(!affectedRows){
       return reply(ReplyUtil.notFound({userId:userId}));
    }
    return reply(ReplyUtil.ok(affectedRows));
        })
        .catch(function(err){
            if(err instanceof Models.Sequelize.ValidationError){
       return reply(ReplyUtil.badData(err,params));
    }
    return reply(ReplyUtil.badImplementation(err));
        });

};

exports.destroy = function (request, reply) {

    var userId = request.params.userId;
    User
        .destroy({
            where: {
           userId: userId
    }
        })
        .then(function(rows) {
            if(!rows){
       return reply(ReplyUtil.notFound({userId:userId}));
    }
    return reply(ReplyUtil.ok(rows));
        })
        .catch(function(err){
            return reply(ReplyUtil.badImplementation(err));
        });

};

exports.signIn = function (request, reply) {

    var params = request.payload;
    User
        .findOne({
            where: {
                email: params.email
            }
        })
        .then(function(user) {
            if(!user){
                return reply(ReplyUtil.invalidPassword());
            }
            if(BcryptUtil.authenticate(params.password, user.password)){
                var token = JwtUtil.getUserToken(user);
                var redisClient = request.server.plugins['hapi-redis'].client;
                redisClient.set('user_'+user.userId, token);
                return reply(ReplyUtil.ok(token));
            }
            return reply(ReplyUtil.invalidPassword());

        })
        .catch(function(err){
            return reply(ReplyUtil.badImplementation(err));
        });

};

exports.logOut = function (request, reply) {
    var userId = request.auth.credentials.jti;
    var redisClient = request.server.plugins['hapi-redis'].client;
    redisClient.del('user_'+userId);
    return reply();
};

exports.methodNotAllowed = function (request, reply) {
    return reply( ReplyUtil.methodNotAllowed() );
};

маршрут

'use strict';

/**
 * Module dependencies.
 */
var User      = require('../controllers/users');
var Validator = require('../validations/users');

/**
 * Resource configuration.
 */
var internals = {};
internals.resourcePath = '/users';

module.exports = function() {
    return [
        {
            method: 'POST',
            path:  internals.resourcePath,
            config : {
                handler: User.create,
                validate: Validator.create
            }
        },
        {
            method: 'GET',
        path:  internals.resourcePath,
        config : {
               handler : User.findAll,
               auth: {
                    strategy: 'token',
                    scope: ['admin']
                }
        }
        },
        {
            method: 'GET',
        path:  internals.resourcePath + '/{userId}',
        config : {
                handler : User.findById,
                validate: Validator.findById,
                auth: {
                    strategy: 'token',
                    scope: ['user']
                }
        }
        },
        {
            method: 'PUT',
        path:  internals.resourcePath + '/{userId}',
        config : {
               handler: User.update,
               validate: Validator.update,
               auth: {
                    strategy: 'token',
                    scope: ['user']
                }
        }
        },
        {
            method: 'DELETE',
        path:  internals.resourcePath + '/{userId}',
        config : {
               handler: User.destroy,
               validate: Validator.destroy,
               auth: {
                    strategy: 'token',
                    scope: ['user']
                }
        }
        },
        {
            method: 'POST',
            path:  internals.resourcePath + '/signin',
            config : {
               handler: User.signIn,
               validate: Validator.signIn
            }
        },
        {
            method: 'GET',
            path:  internals.resourcePath + '/logout',
            config : {
                handler : User.logOut,
                auth: {
                    strategy: 'token',
                    scope: ['user']
                }
            }
        },
        {
            method: '*',
            path: internals.resourcePath + '/{somethingss*}',
            config : {
                handler: User.methodNotAllowed
            }
        }
    ];
}();

person Whisher    schedule 10.08.2015    source источник
comment
lr, вероятно, определяется в файле вашего сервера как глобальный через некоторое время после проверки полезной нагрузки (в обработчике, предварительной или вызываемой там функции? pbs.twimg.com/media/CL-bp3_W8AAimRi.png:large). Можете ли вы опубликовать свой обработчик для маршрута '/api/users'?   -  person Matt Harrison    schedule 10.08.2015
comment
@MattHarrison Я разместил код, спасибо за помощь   -  person Whisher    schedule 10.08.2015
comment
Я пытался запустить find для lr в коде, но это не lr var, по крайней мере, в моем коде   -  person Whisher    schedule 10.08.2015
comment
возможный дубликат Hapi Lab, почему тест не прошел, когда все тесты пройдены   -  person Matt Harrison    schedule 10.08.2015


Ответы (1)


Нет, я немного опоздал, но на всякий случай у кого-то еще есть эта проблема. Это проблема с bcrypt. У меня была аналогичная проблема, когда всякий раз, когда я использовал bcrypt-nodejs, он давал мне The following leaks were detected:lr, password, но когда я перешел на reqular bycrypt, он работал без утечек. Попробуйте обновить версию bycrypt.

person marek newton    schedule 21.12.2016