我正在使用node.js编写一个简单的连续集成工具来学习这个平台。到目前为止,它可以从Github下载一个项目,并将其解压缩到预定义的下拉文件夹中的一个随机文件夹中。但我对纯JavaScript和松散类型的语言非常缺乏经验,我编写的代码在我看来非常混乱。下面是我的小应用程序的相关部分(GitHub上的完整源代码):
{
"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"
}
}
]
}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);
});
}
};
}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;
}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;
}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中字段的名称),以及初始化记录器对象的代码在我看来是样板。如何重构代码,使其更有序,更不容易出错?
发布于 2015-12-03 07:34:38
您的记录器配置看起来不错。这是有点冗长,但如果有进一步的扩展,它是开放的。我不知道您的需求,但是如果您只需要一个文件记录器,并且可以选择一个控制台记录器,您可以将列表更改为如下所示的对象:
loggers: {
"console": true,
"file": {"logFile": "out.log", "errorFile": "err.log"}
}但列个单子就行了。我对你的要求一无所知,所以我会保持原样。
在您的代码中,真正突出的是在loggerBuilder.js中使用回调作为参数。由于这个函数不是异步函数,所以我将放弃回调,直接将错误记录到控制台,或者抛出错误并让它破坏构建。如果您确实希望提供一种机制来向用户报告配置错误,那么将“回调”重命名为类似于"errorHandler“的内容。名称“回调”的使用通常表示将执行一次且只执行一次的函数,在函数完成时将执行该函数,并且不会返回已完成的值,而是将该值作为参数传递给该函数。
另外,我发现您没有将时间记录到文件或控制台记录器的输出中,这让我感到惊讶。没什么大不了的,只是很突出。
https://codereview.stackexchange.com/questions/112684
复制相似问题