如何设置一系列setHeader的DRY

How to Set a Series of setHeader's DRY

我只是在学习使用 DRY 原则,我不知道如何设置一系列 setHeaderDRY(如果可能的话?? ).

感谢任何帮助。

function plugin(options) {
  var defaults = {
      cache:                 0
    , port:                  8080
    , host:                  'localhost'
    , verbose:               false
    , serverInfo:            'myserver'
    , cacheControl:          'no-store'
    , xPowerBy:              'Locomotion'
    , xFrameOptions:         'DENY'
    , xXSSProtection:        '1; mode=block'
    , xContentTypeOption:    'nosniff'
    , contentSecurityPolicy: 'default-src "self"'
  };

  var opts = options || {};

  setDefaults(opts, defaults);

  return function(files, staticsmith, done) {

    if (server) {
      done();
      return;
    }

    // Some stuff

    server = require('http').createServer(function (request, response) {

      response.setHeader('X-Powered-By',            opts.xPowerBy);
      response.setHeader('x-frame-options',         opts.xFrameOptions);
      response.setHeader('X-XSS-Protection',        opts.xXSSProtection);
      response.setHeader('X-Content-Type-Options',  opts.xContentTypeOption);
      response.setHeader('Cache-Control',           opts.cacheControl);
      response.setHeader('Content-Security-Policy', opts.contentSecurityPolicy);

    // Does some more stuff
    };
}

这不是 major/offensive 对 DRY 原则的违反,因为您每次都为不同的 options/values 设置了 header。

检查 documentation,似乎没有接受具有多个 header 属性的 objects 或 objects 数组的重载。

但是,如果您想在视觉上改进代码(并完全消除重复),您可以采用 'data-driven' 方法并使用数组

var headers = [{
    name: 'X-Powered-By',
    option: opts.xPowerBy
}, {
    name: 'x-frame-options',
    option: opts.xFrameOptions
}, {
    name: 'X-XSS-Protection',
    option: opts.xXSSProtection
}, {
    name: 'X-Content-Type-Options',
    option: opts.xContentTypeOption
}, {
    name: 'Cache-Control',
    option: opts.cacheControl
}, {
    name: 'Content-Security-Policy',
    option: opts.contentSecurityPolicy
}];

然后循环

for(var i = 0; i < headers.length; i++){
    response.setHeader(headers[i].name, headers[i].option);
}