В настоящее время я использую библиотеку Ramda для создания новых функций.Вот фрагмент моего кода
function auth(operand) {
if (operand.prevResult.pass && operand.req.authenticated) {
return operand;
} else {
operand.prevResult.pass = false;
return operand;
}
}
function validate(operand) {
if (operand.prevResult.pass && operand.req.validated) {
return operand;
} else {
operand.prevResult.pass = false;
return operand;
}
}
function postHandle(operand) {
if (operand.prevResult.pass){
operand.res.send();
} else {
console.log('some error occured')
}
}
const doPost = R.pipe(auth, validate, postHandle);
//const doGet = R.pipe(auth, validate, getHandle);
//const doPatch ...etc
const req = {authenticated: true, validated: true};
const res = {send: () => {console.log('sent')}};
doPost({req, res, prevResult: {pass: true}});
Цель состояла в том, чтобы иметь возможность создавать doPost
, doGet
, doPatch
etcs, используя некоторые общие методы, такие как аутентификация / валидация.
Однако лучшая функция, которую я могу найти, это R.pipe в Ramda.Это делает это
(((a, b, …, n) → o), (o → p), …, (x → y), (y → z)) → ((a, b, …, n) → z)
Это позволяет мне передать только один аргумент в созданной функции (например, doPost, doGet).Таким образом, последняя строка doPost({req, res, prevResult: {pass: true}});
Я надеялся, что у меня есть способ передать три параметра.Так что я могу сделать doPost(req, res, {pass: true})
в конце концов.Кроме того, сигнатуры каждой функции будут выглядеть намного лучше, например function auth(req, res, prevResult)
, function validate(req, res, prevResult)
, function postHandle(req, res, prevResult)