【问题标题】:Hapi Lab The following leaks were detected:lrHapi Lab 检测到以下泄漏:lr
【发布时间】:2015-11-02 16:07:50
【问题描述】:

这里Hapi Lab why Test failed when all the tests are passed为什么测试失败了。

在这个新问题中,为什么我得到检测到以下泄漏:lr,即使代码中没有全局变量。

运行这个简单的测试

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: 'me@ilwebdifabio.it',
                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: 'me@ilwebdifabio.it',
                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 !

奇怪的是如果我运行这个

payload.passdword

而不是

payload.password

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: 'me@ilwebdifabio.it',
                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: 'me@ilwebdifabio.it',
                passdword: 'mysecret'
            }
        };

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

    });

});

我有

2 次测试中有 1 次失败

测试持续时间: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
            }
        }
    ];
}();

【问题讨论】:

标签: hapijs


【解决方案1】:

不,我有点晚了,但以防万一其他人有这个问题。这是 bcrypt 的问题。我有一个类似的问题,每当我使用 bcrypt-nodejs 时,它都会给我The following leaks were detected:lr, password,但是当我更改为 reqular bycrypt 时,它没有泄漏。尝试更新您的 bycrypt 版本。

【讨论】:

    【解决方案2】:

    只需将所有泄漏元素添加到忽略列表

    "test": "lab -c -L -I 'Reflect,core,_babelPolyfill,regeneratorRuntime,__core-js_shared__ css'",
    

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 2012-01-22
      • 1970-01-01
      • 2017-11-21
      • 2021-09-01
      • 2017-06-16
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多