https://expressjs_com/
Express JS
Fast, unopinionated, minimalist web framework for Node.js
$ npm install express --savev PS C:\nodeproject> npm install express --save
https://expressjs.com/en/starter/hello-world.html
mongoose
mongoosejs/docs/
npm install mongoose --save
cors
CORS is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options.
npmjs-com/package/cors
PS C:\nodeproject>npm i cors
run PS C:\nodeproject> node index.js
index.js
//index.js
const express = require('express')
const mongoose = require('mongoose')
const cors = require('cors')
const UserModel = require('./User')
const app = express()
const port = 3001
app.use(cors())
app.use(express.json())
main().catch(err => console.log(err));
async function main() {
try { //"mongodb+srv://"username":"password"@cluster0.x45tgvn.mongodb.net/"databasename"?retryWrites=true&w=majority&appName=Cluster0"
await mongoose.connect('mongodb+srv://cairocoders:123456@cluster0.x45tgvn.mongodb.net/expressdb?retryWrites=true&w=majority&appName=Cluster0', {});
console.log("CONNECTED TO DATABASE SUCCESSFULLY");
} catch (error) {
console.error('COULD NOT CONNECT TO DATABASE:', error.message);
}
}
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.get('/users', (req, res) => {
UserModel.find()
.then(users => res.json(users))
.catch(err => res.json(err))
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
User.js
//User.js
const mongoose = require('mongoose')
const UserSchema = new mongoose.Schema({
name: String,
email: String,
age: Number
})
const UserModel = mongoose.model("users", UserSchema)
module.exports = UserModel;
Install nextjs npx create-next-app@latest https://nextjs.org/docs/getting-started/installation Install react-query
npm i @tanstack/react-query
tanstack_com/query/latest/docs/framework/react/installation
app\page.tsx
//app\page.tsx
"use client";
import { useQuery } from "@tanstack/react-query"; //npm i @tanstack/react-query https://tanstack.com/query/latest/docs/framework/react/installation
type User = {
id: number;
name: string;
email: string;
};
async function fetchUsers(): Promise<User[]> {
const response = await fetch("https://jsonplaceholder.typicode.com/users");
return response.json();
}
export default function Home() {
const { data, error, isLoading, isError } = useQuery({
queryKey: ["users"],
queryFn: fetchUsers,
});
if (isLoading) return <p> Loading...</p>;
if (isError) return <p> Error: {(error as Error).message}</p>;
return (
<div className="w-screen py-20 flex justify-center flex-col items-center">
<div className="flex items-center justify-between gap-1 mb-5">
<h1 className="text-4xl font-bold">Nextjs 15 Tanstack Query | Node Express MongoDB Atlas</h1>
</div>
<div className='max-w-[1100px] mx-auto mt-10 pb-10 px-4'>
<div className="grid grid-cols-3 gap-x-3 gap-y-3">
{data?.map((user, key) => (
<div key={key} className="bg-primary p-10 rounded-lg shadow-md border border-gray-200">
{" "}
<h4> Name: {user.name}</h4> <p> Email: {user.email}</p>{" "}
</div>
))}
</div>
</div>
</div>
);
}
app\node-express-api\page.tsx
//app\node-express-api\page.tsx
"use client";
import { useQuery } from "@tanstack/react-query"; //npm i @tanstack/react-query https://tanstack.com/query/latest/docs/framework/react/installation
type User = {
id: number;
name: string;
email: string;
};
async function fetchUsers(): Promise<User[]> {
const response = await fetch("http://localhost:3001/users");
return response.json();
}
export default function Home() {
const { data, error, isLoading, isError } = useQuery({
queryKey: ["users"],
queryFn: fetchUsers,
});
if (isLoading) return <p> Loading...</p>;
if (isError) return <p> Error: {(error as Error).message}</p>;
return (
<div className="w-screen py-20 flex justify-center flex-col items-center">
<div className="flex items-center justify-between gap-1 mb-5">
<h1 className="text-4xl font-bold">Nextjs 15 Tanstack Query | Node Express MongoDB Atlas</h1>
</div>
<div className='max-w-[1100px] mx-auto mt-10 pb-10 px-4'>
<div className="grid grid-cols-3 gap-x-3 gap-y-3">
{data?.map((user, key) => (
<div key={key} className="bg-primary p-10 rounded-lg shadow-md border border-gray-200">
{" "}
<h4> Name: {user.name}</h4> <p> Email: {user.email}</p>{" "}
</div>
))}
</div>
</div>
</div>
);
}
app\layout.tsx
//app\layout.tsx
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import QueryProvider from "./components/QueryProvider";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
<QueryProvider>{children}</QueryProvider>
</body>
</html>
);
}
app\components\QueryProvider.tsx
//app\components\QueryProvider.tsx
"use client";
import { QueryClientProvider, QueryClient } from "@tanstack/react-query";
import { useState } from "react";
interface Props {
children: React.ReactNode;
}
export default function QueryProvider({ children }: Props) {
const [queryClient] = useState(() => new QueryClient());
return (
<QueryClientProvider client={queryClient}> {children} </QueryClientProvider>
);
}
run C:\nextjs>npm run dev 