javascript Подкласс node.js выражает методы для добавления общей функциональности? - PullRequest
1 голос
/ 08 июня 2011

Извините, я все еще довольно новичок в Javascript, поэтому надеюсь, что этот вопрос не слишком прост, но:

Я обнаружил, что пишу много кода в node.js (экспресс)по следующим направлениям:

app.get("urlscheme1", function (res, resp) {

  try {
     auth_request(req);  // throws on failure
     validate_url_params(req);  // throws on failure
     common_tasks();

     specific_taskABC();
  } catch (e) {
     if (e.error == "auth") {
         resp.send(....);
     } else if (e.error == "url_scheme") {
         resp.send(....);
     } else {
         resp.send(translate_error(e), code_for_error(e)):
     }
  }

});

app.put("urlscheme1", function (res, resp) {

  try {
     auth_request(req);  // throws on failure
     validate_url_params(req);  // throws on failure
     common_tasks();

     specific_taskDEF();
  } catch (e) {
     if (e.error == "auth") {
         resp.send(....);
     } else if (e.error == "url_scheme") {
         resp.send(....);
     } else {
         resp.send(translate_error(e), code_for_error(e)):
     }
  }

});


app.post("urlscheme1", function (res, resp) {

  try {
     auth_request(req);  // throws on failure
     validate_url_params(req);  // throws on failure
     common_tasks();

     specific_taskGHI();
  } catch (e) {
     if (e.error == "auth") {
         resp.send(....);
     } else if (e.error == "url_scheme") {
         resp.send(....);
     } else {
         resp.send(translate_error(e), code_for_error(e)):
     }
  }

});

Это кажется УЖАСНО расточительным.Но я не на 100% доволен всем синтаксисом / семантикой prototype и «подклассом» в JS, пока недостаточно, чтобы понять, как сделать это лучше.Есть ли какой-нибудь способ расширить существующий класс (в данном случае это приложение express), чтобы я мог сделать что-то вроде:

app.get("urlscheme1", function(res, resp) {
  do_something_ABC();
});
app.get("urlscheme1", function(res, resp) {
  do_something_DEF();
});
app.get("urlscheme1", function(res, resp) {
  do_something_GHI();
});

, где все эти функции-обработчики все еще выполняют этот «общий» код?

Спасибо!

1 Ответ

3 голосов
/ 08 июня 2011

Примерно так будет работать:

function install(urlscheme, method, specific_task) {

  function handler(res, resp) {
      try {
         auth_request(req);  // throws on failure
         validate_url_params(req);  // throws on failure
         common_tasks();
         specific_task();
      } catch (e) {
         if (e.error == "auth") {
             resp.send(....);
         } else if (e.error == "url_scheme") {
             resp.send(....);
         } else {
             resp.send(translate_error(e), code_for_error(e)):
         }
      }
    }

  app[method](urlscheme,handler); // app.post(), app.get(), etc.
};

install("urlscheme1","get", do_something_ABC );
install("urlscheme1","post", do_something_DEF );
install("urlscheme1","put", do_something_GHI );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...