Node.js + Express backend for a rider delivery app.
Features:
- Register rider/user
- Login using Iqama ID and password
- JWT protected routes
- MongoDB with Mongoose
- Cloudinary photo uploads
- Store orders with pickup photo, delivery photo, times, and calculated duration
src/
config/
cloudinary.js
db.js
controllers/
auth.controller.js
order.controller.js
middleware/
auth.middleware.js
error.middleware.js
upload.middleware.js
models/
Order.js
User.js
routes/
auth.routes.js
order.routes.js
utils/
asyncHandler.js
generateToken.js
uploadToCloudinary.js
app.js
server.jsInstall packages:
npm installCreate .env from example:
cp .env.example .envFill these values:
MONGODB_URI=your_mongodb_atlas_connection_string
JWT_SECRET=your_long_secret
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secretRun development server:
npm run devServer runs on:
http://localhost:5000GET /api/healthPOST /api/auth/register
Content-Type: application/jsonBody:
{
"name": "Aaqib",
"iqamaId": "123456789",
"password": "123456"
}POST /api/auth/login
Content-Type: application/jsonBody:
{
"iqamaId": "123456789",
"password": "123456"
}Response includes token. Use it in protected routes:
Authorization: Bearer YOUR_TOKENPOST /api/orders
Authorization: Bearer YOUR_TOKEN
Content-Type: multipart/form-dataForm fields:
pickupPhoto: image file
deliveryPhoto: image file
pickupTime: 2026-06-28T10:00:00.000Z
deliveryTime: 2026-06-28T10:15:30.000Z
notes: optional textGET /api/orders/my-orders
Authorization: Bearer YOUR_TOKENGET /api/orders/:id
Authorization: Bearer YOUR_TOKENDELETE /api/orders/:id
Authorization: Bearer YOUR_TOKENconst formData = new FormData();
formData.append("pickupPhoto", {
uri: pickupPhoto.uri,
name: "pickup.jpg",
type: "image/jpeg",
} as any);
formData.append("deliveryPhoto", {
uri: deliveryPhoto.uri,
name: "delivery.jpg",
type: "image/jpeg",
} as any);
formData.append("pickupTime", pickupPhoto.time.toISOString());
formData.append("deliveryTime", deliveryPhoto.time.toISOString());
const response = await fetch("http://YOUR_LOCAL_IP:5000/api/orders", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
body: formData,
});
const data = await response.json();For Android physical phone, do not use localhost. Use your computer LAN IP, for example:
http://192.168.1.20:5000