簡體   English   中英

如何重構此代碼?

[英]How refactor this code?

我有點沮喪,因為我不知道如何重構這個腳本。 我編寫了authenticate函數,但是它太復雜了,可能在一個函數中太大了,並且似乎有點spagetti :(,我將如何使其變得更好一點?有些線索嗎?謝謝。

"use strict";
var errorResponse = require('../errorResponse'),
    paynopain = require('../../core/paynopain'),
    User = require('../../core/User'),
    cache = require('../../core/cache/cache'),
    validateValues = require('../validateValues'),
    API_PATH = 'v1/';


function authenticate(req, res, next) {

    if (req.url.indexOf(API_PATH) !== -1){

        var pnpUserId;
        var validated = validateValues(req, ['pnp_access_token']);
        if(validated.error){
            return next(validated.error);
        }
        var pnpAccessToken = req.params.pnp_access_token;

        cache.read('pnpToken:' + pnpAccessToken)
            .then(function(userId){
                if(userId){
                    storeUserIdInRequest(req, next, userId);
                }else{
                    var user = new User(req.logger);
                    return paynopain.getIdFromAccessToken(pnpAccessToken)
                        .then(function(pnpUserIdResult){
                            pnpUserId = pnpUserIdResult;
                            return user.findByPnpID(pnpUserIdResult);
                        })
                        .then(function(userData){

                            if(userData._id){
                                return storeUserIdInRequest(req, next, userData._id.toString());
                            }else{
                                var newUser = {
                                    pnpId: pnpUserId,
                                    radius: 1000
                                };
                                return user.create(newUser)
                                    .then(function(userData){
                                        return storeUserIdInRequest(req, next, userData._id);
                                    });
                            }

                        });
                }
            })
            .fail(function(e){

                if(e.message === 'invalid_grant'){
                    next(errorResponse.unauthorized());
                }else{
                    req.logger.log('error', 'Error authenticating', {
                        error: {
                            message: e.message,
                            stack: e.stack
                        }
                    });
                    next(errorResponse.internalError());
                }

            });

    }else{
        next();
    }

}

function storeUserIdInRequest(req, next, userId){

    var oneHour = 1000 * 60 * 60;
    cache.write('pnpToken:' + req.params.pnp_access_token, userId, {
        expire: oneHour
    })
        .then(function(){
            req.userId = userId;
            req.logger.setExtra({
                userId: userId
            });
            next();
        });

}

function init(server){
    server.use(authenticate);
    require('./configuration/routes')(API_PATH, server);
    require('./products/routes')(API_PATH, server);
    require('./tracking/routes')(API_PATH, server);
    require('./lists/routes')(API_PATH, server);
}
module.exports = init;

不會更好,因為我無法看到和更改Usercache和其他對象方法的行為,但是我希望您可以從中使用一些想法:

"use strict";
var errorResponse = require('../errorResponse'),
    paynopain = require('../../core/paynopain'),
    User = require('../../core/User'),
    cache = require('../../core/cache/cache'),
    validateValues = require('../validateValues'),
    API_PATH = 'v1/';


function authenticate(req, res, next) {
    if (req.url.indexOf(API_PATH) == -1) {
        return next();
    }

    var validated = validateValues(req, ['pnp_access_token']);

    if (validated.error){
        return next(validated.error);
    }

    var pnpAccessToken = req.params.pnp_access_token;

    cache.read('pnpToken:' + pnpAccessToken)
        .then(function(userId){
            if (userId) return userId;

            var user = new User(req.logger);
            return paynopain.getIdFromAccessToken(pnpAccessToken)
                .then(function(pnpUserIdResult){
                    return [ user.findByPnpID(pnpUserIdResult), pnpUserIdResult ];
                })
                .spread(function(userData, pnpUserId){
                    if (userData._id){
                        return userData;
                    }

                    return user.create({
                        pnpId: pnpUserId,
                        radius: 1000
                    });
                }).then(function(user) {
                    return user._id.toString();
                });
        })
        .then(function(userID) {
            return storeUserIdInRequest(req, userId);
        })
        .then(next)
        .fail(function(e){

            if(e.message === 'invalid_grant'){
                next(errorResponse.unauthorized());
            }else{
                req.logger.log('error', 'Error authenticating', {
                    error: {
                        message: e.message,
                        stack: e.stack
                    }
                });
                next(errorResponse.internalError());
            }

        });

}

function storeUserIdInRequest(req, userId){

    var oneHour = 1000 * 60 * 60;
    return cache.write('pnpToken:' + req.params.pnp_access_token, userId, {
        expire: oneHour
    })
    .then(function(){
        req.userId = userId;
        req.logger.setExtra({
            userId: userId
        });
    });

}

function init(server){
    server.use(authenticate);
    require('./configuration/routes')(API_PATH, server);
    require('./products/routes')(API_PATH, server);
    require('./tracking/routes')(API_PATH, server);
    require('./lists/routes')(API_PATH, server);
}
module.exports = init;

注意:我無法對其進行測試,所以我不知道它是否真的可以正常工作!

提示:

  • 使用Q.reject來解決傳遞和處理錯誤(尤其是在User和其他“核心”對象方法中)
  • 在不需要時不使用else
  • 請參閱ODM \\ ORM API( Mongoose \\ Mongoose-q是一個很好的示例)以了解如何設計干凈的編程接口

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM