首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连续集成工具

连续集成工具
EN

Code Review用户
提问于 2015-12-03 00:27:34
回答 1查看 60关注 0票数 1

我正在使用node.js编写一个简单的连续集成工具来学习这个平台。到目前为止,它可以从Github下载一个项目,并将其解压缩到预定义的下拉文件夹中的一个随机文件夹中。但我对纯JavaScript和松散类型的语言非常缺乏经验,我编写的代码在我看来非常混乱。下面是我的小应用程序的相关部分(GitHub上的完整源代码):

config.json

代码语言:javascript
复制
{
  "port": "8081",
  "dropDownFolder": "E:\\dropdown",
  "loggers": [
    {
      "type": "consoleLogger"
    },
    {
      "type": "consoleLogger"
    },
    {
      "type": "fileLogger",
      "logFile": "log.log",
      "errorFile": "error.log"
    }
  ],
  "builds": [
    {
      "name": "SimpleCI",
      "urlToListen": "/simpleci",
      "copyTo": "E:\\dropdown",
      "dataSource": {
        "sourceType": "github",
        "user": "andreysarafanov",
        "repository": "SimpleCI",
        "branch": "master"
      }
    }
  ]
}

Logging/loggerBuilder.js

代码语言:javascript
复制
var config = require("./../config.json");
var FileLogger = require('./fileLogger');
var ConsoleLogger = require('./consoleLogger');
var _ = require('underscore');

module.exports = function buildLogger(callback) {
  //console.log("start building loggers " + config.logger);
  var loggers = [];
  _.each(config.loggers, function(logger) {
    if (logger.type === "fileLogger") {
      loggers.push(new FileLogger(logger.logFile, logger.errorFile));
    }
    else if (logger.type === "consoleLogger") {
      loggers.push(new ConsoleLogger());
    }
    else {
      callback("Logger type \"" + logger.type + "\" is not supported.");
    }
  });

  return {
    log: function log(message) {
      _.each(loggers, function (logger) {
        logger.log(message);
      });
    },
    error: function error(message) {
      _.each(loggers, function (logger) {
        logger.error(message);
      });
    }
  };
}

Logging/fileLogger.js

代码语言:javascript
复制
var fs = require('fs');
var endOfLine = require('os').EOL;
module.exports = function fileLogger(logFile, errorFile) {
  return {
    log: function log(message) {
      fs.appendFile(logFile, buildString("debug", message));
    },
    error: function error(message) {
      fs.appendFile(logFile, buildString("error", message));
    }
  };
}

function buildString(type, message) {
  var time = new Date();
  return type.toUpperCase() + ": [" + time.getYear() + "." 
    + time.getMonth() + "." + time.getDate() + "] - " + message + endOfLine;
}

Logging/consoleLogger.js

代码语言:javascript
复制
module.exports = function consoleLogger() {
  return {
    log: function log(message) {
      console.log(buildString(message));
    },
    error: function error(message) {
      console.error(buildString(message));
    }
  };
}

function buildString(message) {
  var time = new Date();
  return "[" + time.getYear() + "." + time.getMonth() + "." 
    + time.getDate() + "] - " + message;
}

index.js

代码语言:javascript
复制
var http = require("http");
var express = require("express");
var _ = require("underscore");
var config = require('./config.json');
var dataLoader = require("./DataLoaders/dataLoader.js")
var uuid = require('node-uuid');
var LoggerBuilder = require('./Logging/loggerBuilder');

var app = express();

var logger = LoggerBuilder(function(err) {
  if (err) console.error(err);
})

_.each(config.builds, function(build) {
  app.get(build.urlToListen, function(req, res) {
    console.log("A request for build " + build.name + " has been received");
    var id = uuid.v4();
    dataLoader.downLoadDataForBuild(build.dataSource, id, function(err) {
      if (err) {
        logger.error(err);
        res.send("Error: " + err);
      }
      else {
        logger.log("downloaded data for build " + build.name + " to subdirectory " + id);
        res.send("Success");
      }
    })
  })
});

app.listen(config.port);

我可以在config.json中配置多个记录器,并将输出写入所有这些记录器(在本例中--两次写入控制台和文件)。代码似乎像预期的那样工作,但我最终依赖于字符串常量(记录器类型为"fileLogger""consoleLogger"config.json中字段的名称),以及初始化记录器对象的代码在我看来是样板。如何重构代码,使其更有序,更不容易出错?

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-12-03 07:34:38

您的记录器配置看起来不错。这是有点冗长,但如果有进一步的扩展,它是开放的。我不知道您的需求,但是如果您只需要一个文件记录器,并且可以选择一个控制台记录器,您可以将列表更改为如下所示的对象:

代码语言:javascript
复制
loggers: {
  "console": true,
  "file": {"logFile": "out.log", "errorFile": "err.log"}
}

但列个单子就行了。我对你的要求一无所知,所以我会保持原样。

在您的代码中,真正突出的是在loggerBuilder.js中使用回调作为参数。由于这个函数不是异步函数,所以我将放弃回调,直接将错误记录到控制台,或者抛出错误并让它破坏构建。如果您确实希望提供一种机制来向用户报告配置错误,那么将“回调”重命名为类似于"errorHandler“的内容。名称“回调”的使用通常表示将执行一次且只执行一次的函数,在函数完成时将执行该函数,并且不会返回已完成的值,而是将该值作为参数传递给该函数。

另外,我发现您没有将时间记录到文件或控制台记录器的输出中,这让我感到惊讶。没什么大不了的,只是很突出。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/112684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档