# ===================================================================== # Reinicia el portal en limpio: mata lo que ocupe el puerto, siembra la # base y arranca el servidor. Sembrar mientras un servidor viejo sigue # vivo deja errores raros ("Table doesn't exist"), así que primero se # libera el puerto de verdad, por PID y no por nombre de proceso. # # powershell -ExecutionPolicy Bypass -File scripts\reiniciar.ps1 # powershell -ExecutionPolicy Bypass -File scripts\reiniciar.ps1 -SinSembrar # ===================================================================== param( [int]$Puerto = 4180, [switch]$SinSembrar ) $ErrorActionPreference = 'Stop' $raiz = Split-Path -Parent $PSScriptRoot Set-Location $raiz Write-Host "Liberando el puerto $Puerto..." $ocupantes = @() try { $ocupantes = Get-NetTCPConnection -LocalPort $Puerto -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -Unique } catch {} # $PID es de solo lectura en PowerShell, así que la variable va con otro nombre. foreach ($idProceso in $ocupantes) { try { $p = Get-Process -Id $idProceso -ErrorAction Stop Write-Host " cerrando $($p.ProcessName) (PID $idProceso)" Stop-Process -Id $idProceso -Force } catch {} } # Espera a que el puerto quede realmente libre antes de seguir. for ($i = 0; $i -lt 20; $i++) { $sigue = Get-NetTCPConnection -LocalPort $Puerto -State Listen -ErrorAction SilentlyContinue if (-not $sigue) { break } Start-Sleep -Milliseconds 250 } $sigue = Get-NetTCPConnection -LocalPort $Puerto -State Listen -ErrorAction SilentlyContinue if ($sigue) { throw "El puerto $Puerto sigue ocupado. Ciérralo a mano antes de seguir." } if (-not $SinSembrar) { Write-Host "Sembrando la base..." & node db/seed.mjs if ($LASTEXITCODE -ne 0) { throw "La siembra falló." } } Write-Host "Arrancando el servidor..." Start-Process -FilePath 'node' -ArgumentList 'server/index.mjs' ` -RedirectStandardOutput 'server.log' -RedirectStandardError 'server.err.log' ` -WindowStyle Hidden | Out-Null for ($i = 0; $i -lt 40; $i++) { Start-Sleep -Milliseconds 250 try { $r = Invoke-WebRequest -Uri "http://localhost:$Puerto/api/auth/demo" -UseBasicParsing -TimeoutSec 2 if ($r.StatusCode -eq 200) { Write-Host "`nListo: http://localhost:$Puerto`n" -ForegroundColor Green exit 0 } } catch {} } Write-Host "`nEl servidor no respondió. Revisa server.err.log:`n" -ForegroundColor Red Get-Content server.err.log -ErrorAction SilentlyContinue | Select-Object -First 20 exit 1