Mi aplicación nodejs express sirve un archivo que requiere y carga archivos css, js, etc. Tengo un middleware de registro que solicita la ip de un cliente y registra dicha ip (después de comprobar que no coincide con un archivo json de ips maliciosas ). Debido a los recursos que carga el servidor, cuando una persona carga una página una vez, el servidor registrará la ip muchas veces.
registro de middleware:
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(); } } }); }La ip también se registra en un archivo json separado para realizar un seguimiento de quién se ha conectado, esto llena la matriz json con la misma ip una y otra vez, en lugar de solo una vez. ¿Hay alguna manera de registrar la ip solo una vez para una conexión en lugar de para cada conexión a todos los demás archivos requeridos?
archivo JSON según lo solicitado:
{ "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 } ] }Puedes hacer algo como esto:
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 } } También podría haber otras formas, como agregar la dirección IP como clave en el objeto o puede usar Map DS desde el JS nativo, es eficiente para buscar.