实现*logger*功能,该功能将为日志记录准备数据



我有一项任务实现记录器功能,该功能将为日志记录准备数据。它应该有默认的服务配置{serviceName: 'global', serviceId: 1}
一些示例:

// {"3-0":"[auth_service] Wrong email","3-1":"[auth_service] Wrong password","3-2":"[auth_service] Success login"}
logger(['Wrong email', 'Wrong password', 'Success login'], {serviceName: 'auth_service', serviceId: 3});
// {"1-0":"[global] Fatal error","1-1":"[global] Data corrupted"}
logger(['Fatal error', 'Data corrupted']);

应该使用Typescript编写。我开始制作这个函数,但我不知道如何让它看起来像示例或测试样本。。这就是我现在所做的:

function logger(data: [], serviceInfo: {}) {
//It should have default service configuration `{serviceName: 'global', serviceId: 1}`
if (serviceInfo == undefined) {
serviceInfo = {
serviceName: "global",
serviceId: 1,
};
} else {
let obj = {

}
return obj;
}
}

单元测试:

describe('logger', () => {
it('should log user events', () => {
const result = logger(['User Event 1', 'User Event 2'], {serviceName: 'user', serviceId: 12});
const expected = {
'12-0': '[user] User Event 1',
'12-1': '[user] User Event 2',
};
assert.deepStrictEqual(result, expected)
});
it('should log auth events', () => {
const result = logger(['Event 1', 'Event 2', 'Event 3'], {serviceName: 'auth', serviceId: 2});
assert.strictEqual(result['2-1'], '[auth] Event 2')
});
it('should log global events', () => {
const result = logger(['Event 1', 'Event 2', 'Event 3']);
assert.strictEqual(result['1-2'], '[global] Event 3')
});
});

我曾想过将数组推入另一个对象,但我不知道如何根据serviceId将其显示为:

{
'12-0':'[user] User event 1'
}

其中,12是服务id,0是数组项索引,[user]是serviceName,用户事件1是数组项。。我是Javascript和Typescript的新手,我了解所有的细微差别。你能帮我吗?提前感谢!

编辑:我试了一下,想出了这个功能:

function logger(data: [], serviceInfo: {}) {
//It should have default service configuration `{serviceName: 'global', serviceId: 1}`
serviceInfo = {
serviceName : 'Gigi',
serviceId : 0
}
if (serviceInfo == undefined) {
serviceInfo = {
serviceName: "global",
serviceId: 1,
};
} 
let obj={}
//obj[serviceInfo.serviceId.value + ]
data.forEach(function (value, i) {
//console.log('%d: %s', i, value);
obj[serviceInfo.serviceId.value +'-'+ i] = '[' + serviceInfo.serviceName.value + ']' + value
});
console.log(obj)
}

但在控制台中我得到:

{
'undefined-0': '[undefined]User Event 1',
'undefined-1': '[undefined]User Event 2'
}
{
'undefined-0': '[undefined]Event 1',
'undefined-1': '[undefined]Event 2',
'undefined-2': '[undefined]Event 3'
}
{
'undefined-0': '[undefined]Event 1',
'undefined-1': '[undefined]Event 2',
'undefined-2': '[undefined]Event 3'
}

如果数据是从输入而不是从函数获取的,如何访问serviceName和serviceId?

我用这种方式解决了这个函数:

function logger(data: [], serviceInfo: {}) {
if (serviceInfo == undefined) {
serviceInfo = {
serviceName: "global",
serviceId: 1,
};
}
let obj = {};
data.forEach(function (value, i) {
//console.log('%d: %s', i, value);
obj[serviceInfo.serviceId + "-" + i] =
"[" + serviceInfo.serviceName + "] " + value;
});
return obj
}

当我编辑这个问题时,这里的问题是我不正确地访问了对象属性来获得值,所以,现在函数通过了所有测试单元。

如果您首先使用typescript进行编写,那么编写接口非常有用。

interface ServiceConfig {
serviceName: string;
serviceId: number;
}
function logger(messages: string[], config: ServiceConfig = { serviceName: 'global', serviceId: 1 }): Record<string, string> {
const result: Record<string, string> = {};

messages.forEach((message, index) => {
const key = `${config.serviceId}-${index}`;
const log = `[${config.serviceName}] ${message}`;
result[key] = log;
});

return result;
}

最新更新