【问题标题】:javascript Subclass node.js express methods to add common functionality?javascript 子类 node.js 表达方法来添加常用功能?
【发布时间】:2011-06-08 04:23:17
【问题描述】:

抱歉,这里的 JavaScript 还是相当新的,所以希望这个问题不会太令人尴尬,但是:

我发现我在 node.js (express) 中按照以下几行编写了很多代码:

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)):
     }
  }

});

这似乎非常浪费。但是,我对 JS 中的所有 prototype 和“子类化”语法/语义并不是 100% 满意,还不足以理解如何让它变得更好。有没有办法扩展一个现有的类(在这个实例中是 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();
});

所有这些处理函数仍在哪里执行“通用”代码?

谢谢!

【问题讨论】:

  • 听起来像是middleware 的工作!
  • 哦,哇,我没有看到中间件的那部分。非常棒,是的。谢谢!

标签: javascript oop node.js express


【解决方案1】:

这样的事情会起作用:

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 );

【讨论】:

  • 这是一个很好的解决方案,谢谢。这个和中间件的某种组合可能正是我正在寻找的。​​span>
猜你喜欢
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多