我的nodejs express应用程序提供一个需要并加载css文件、js文件等的文件。我有一个日志中间件,它请求客户端的ip并记录所述ip (在检查它与恶意ips的json文件不匹配后)。由于服务器加载的资源,当一个人加载一个页面时,服务器会多次记录该ip。
日志中间件:
function checkIP(req, res, next) {
const clientIp = req.ip;
let allowCXN = true;
//read json file
fs.readFile("ip_info.json", "utf8", function (err, data) {
if (err) {
console.log(err);
} else {
var ip_info = JSON.parse(data);
for (let i = 0; i <= ip_info.ip_array.length - 1; i++) {
//console.log(ip_info.ip_array[i].ip);
if (clientIp == ip_info.ip_array[i].ip) {
allowCXN = false;
}
}
if (!allowCXN) {
res.end();
next();
}
} else {
console.log("Now serving ip:", "\x1b[33m", clientIp, "\x1b[37m");
next();
}
}
});
}
ip也被记录到一个单独的json文件中,以跟踪谁已经连接,这会一次又一次地用相同的ip填充json数组,而不是只有一次。有没有办法只记录一个连接的ip一次,而不是每次连接到所有其他所需的文件?
请求的JSON文件:
{
"ip_array": [
{
"ip": "::ffff:198.23.172.233",
"unauth_joins": 0
},
{
"ip": "::ffff:64.62.197.182",
"unauth_joins": 0
},
{
"ip": "::ffff:23.148.145.235",
"unauth_joins": 0
},
{
"ip": "::1",
"unauth_joins": 0
},
{
"ip": "::ffff:127.0.0.1",
"unauth_joins": 0
}
]
}
发布于 2021-09-05 17:09:42
你可以这样做:
const ip_info = JSON.parse(data);
for (let i = 0; i <= ip_info.ip_array.length - 1; i++) {
//console.log(ip_info.ip_array[i].ip);
const result = ip_info.ip_array.find(el => el.ip === 'userIPAddress');
if(result) {
// it means IP exist don't append in the data
} else {
// add to the array
}
}
也可能有其他方法,比如在对象中添加IP地址作为关键字,或者您可以从JS本机使用Map
DS,这对于搜索是有效的。
https://stackoverflow.com/questions/69060440
复制相似问题