[英]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;
不會更好,因為我無法看到和更改User
, cache
和其他對象方法的行為,但是我希望您可以從中使用一些想法:
"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;
注意:我無法對其進行測試,所以我不知道它是否真的可以正常工作!
提示:
User
和其他“核心”對象方法中) else
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.