DEV Community

Bolarinwa Olayinka
Bolarinwa Olayinka

Posted on

The Journey from a Simple 'Click' to a Confirmed Connection

Building a modern application is rarely a single, smooth process. It’s a series of meticulously solved problems, often starting with the most basic components. This week, I hit a significant milestone on my latest project, but the journey to get there was a valuable lesson in full-stack debugging and resilience.

The task seemed straightforward: create a settings page in a React application that allows a user to save their Azure DevOps credentials. The first step was to build the two sides of the connection: the frontend, a user-friendly interface, and the backend, a robust Node.js server designed to receive and process the data.

At first glance, everything looked correct. I had two separate terminals open, each running a server. The frontend application was live in my browser, and the backend terminal showed the comforting message, "Backend server running on port 5000." My code was in place, and I confidently typed in the details and clicked the "Save Azure DevOps Settings" button.

Then came the first unexpected challenge. The frontend displayed a success pop-up, but nothing—absolutely nothing—happened in the backend terminal. The silence was deafening. My initial instinct was to blame a communication error, but the truth was far more subtle. After reviewing the code, I discovered a crucial detail: the frontend's save function was a placeholder. It was designed to simulate a successful save with a simple pop-up, but it was not actually sending a network request to the backend. It was a good reminder that just because an interface looks functional, it doesn't mean the underlying systems are connected.

The fix was to replace the placeholder with a proper fetch request, instructing the frontend to send the user's data to the backend endpoint. But with this correction came a new error: the dreaded "EADDRINUSE" message. This meant a ghost process was still occupying the server port, preventing my new, corrected server from starting. Debugging this required a methodical approach, checking for active processes, identifying the culprit, and terminating it before successfully restarting the server. It wasn't a complex fix, but it required persistence to get the system into the right, clean state.

Finally, with both my frontend and backend running, I clicked the "Save" button one last time. I watched my backend terminal as if it were a live status board. And there it was—a new line of text, a console.log message displaying the data I had just entered from my browser.

This seemingly small achievement—a line of text in a terminal—represented much more. It was a tangible confirmation that the full-stack system was connected and working as intended. The entire process, from identifying the initial placeholder code to meticulously clearing a stuck port, was a testament to the methodical and resilient approach required for technical development. This kind of work isn't just about writing code; it's about building and debugging systems, and it's a foundational skill for anyone looking to make a meaningful impact in the field.

With this vital connection established, the real work can now begin: adding the actual logic to the backend to create an Azure DevOps project via Infrastructure as Code. The foundation is solid, and the path forward is clear.
[A screenshot of the backend terminal, showing the successful console.log message. This confirms that the frontend application has successfully sent data to the backend.".]

Top comments (0)