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