Here's the updated document controller with consistent user ID handling:
import Document from "../models/document.model.js"
import mongoose from "mongoose"
export const getAllDocuments = async (req, res) => {
try {
// Use _id consistently since that's what's in your token
const userId = req.user?._id
const documents = await Document.find({
owner: userId,
isDeleted: false,
}).sort({ lastEdited: -1 })
console.log(`Found ${documents.length} documents for user ${userId}`)
return res.json({
success: true,
documents: documents.map((doc) => ({
id: doc._id,
title: doc.title,
lastEdited: doc.lastEdited,
createdAt: doc.createdAt,
})),
})
} catch (error) {
console.error("Get documents error:", error)
return res.status(500).json({
error: "Failed to fetch documents",
details: String(error),
})
}
}
export const getDocumentById = async (req, res) => {
try {
const id = req.params.id
// Use _id consistently
const userId = req.user?._id
if (!id || !mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).json({ error: "Invalid document ID" })
}
const document = await Document.findOne({
_id: id,
owner: userId,
isDeleted: false,
})
if (!document) {
return res.status(404).json({ error: "Document not found" })
}
return res.json({
success: true,
document: {
id: document._id,
title: document.title,
content: document.content,
lastEdited: document.lastEdited,
},
})
} catch (error) {
console.error("Get document error:", error)
return res.status(500).json({
error: "Failed to fetch document",
details: String(error),
})
}
}
export const createDocument = async (req, res) => {
try {
// Use _id consistently and log it properly
console.log("Creating document for user:", req.user?._id)
const { title = "Untitled Document", content = "" } = req.body
// Add null check for content
console.log("Document data:", { title, contentLength: content?.length || 0 })
const document = await Document.create({
title,
content: content || "", // Ensure content is never undefined
owner: req.user?._id,
lastEdited: new Date(),
})
console.log("Document created:", document._id)
return res.status(201).json({
success: true,
document: {
id: document._id,
title: document.title,
content: document.content,
lastEdited: document.lastEdited,
},
})
} catch (error) {
console.error("Create document error:", error)
return res.status(500).json({
error: "Failed to create document",
details: String(error),
})
}
}
export const updateDocument = async (req, res) => {
try {
const id = req.params.id
// Use _id consistently
const userId = req.user?._id
if (!id || !mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).json({ error: "Invalid document ID" })
}
const { title, content } = req.body
const updateData = { lastEdited: new Date() }
if (title !== undefined) updateData.title = title
if (content !== undefined) updateData.content = content
const document = await Document.findOneAndUpdate(
{
_id: id,
owner: userId,
isDeleted: false,
},
updateData,
{ new: true },
)
if (!document) {
return res.status(404).json({ error: "Document not found" })
}
return res.json({
success: true,
document: {
id: document._id,
title: document.title,
content: document.content,
lastEdited: document.lastEdited,
},
})
} catch (error) {
console.error("Update document error:", error)
return res.status(500).json({
error: "Failed to update document",
details: String(error),
})
}
}
export const deleteDocument = async (req, res) => {
try {
const id = req.params.id
// Use _id consistently
const userId = req.user?._id
if (!id || !mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).json({ error: "Invalid document ID" })
}
const document = await Document.findOneAndUpdate(
{
_id: id,
owner: userId,
},
{ isDeleted: true },
{ new: true },
)
if (!document) {
return res.status(404).json({ error: "Document not found" })
}
return res.json({
success: true,
message: "Document deleted successfully",
})
} catch (error) {
console.error("Delete document error:", error)
return res.status(500).json({
error: "Failed to delete document",
details: String(error),
})
}
}
export const createSimpleDocument = async (req, res) => {
try {
console.log("Simple document creation started")
// Use _id consistently
const userId = req.user?._id
// Create a simple document
const document = await Document.create({
title: "Test Document",
content: "This is a test document",
owner: userId,
lastEdited: new Date(),
})
console.log("Document created:", document._id)
return res.status(201).json({
success: true,
document: {
id: document._id,
title: document.title,
content: document.content,
lastEdited: document.lastEdited,
},
})
} catch (error) {
console.error("Simple document creation error:", error)
return res.status(500).json({
error: "Failed to create document",
details: String(error),
})
}
}Key changes made:
req.user?.id to req.user?._id for consistencycontent?.length || 0content || "" to ensure it's never undefinedThis should fix the issues you're experiencing with document creation. The controller now consistently uses _id which matches what's in your JWT token.
it gave still this issue
Auth header: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzU3NDhjMzY3NTYwMzA5MWMxMmM4MzgiLCJyb2xlIjoiQURNSU4iLCJpYXQiOjE3NDQxMTU3ODMsImV4cCI6MTc0NDExOTM4M30.GveeurW5mfDh2ovEP6BwhiRJtvDMuLgAdjxVuBE1ju0
Token extracted: Valid token
Decoded token user ID: undefined
Creating document for user: 675748c3675603091c12c838
Create document error: TypeError: Cannot read properties of undefined (reading 'title')
at createDocument (file:///D:/Tempthrusday/server/api/controllers/document.controller.js:77:13)
at Layer.handle [as handle_request] (D:\Tempthrusday\server\node_modules\express\lib\router\layer.js:95:5)
at next (D:\Tempthrusday\server\node_modules\express\lib\router\route.js:149:13)
at Route.dispatch (D:\Tempthrusday\server\node_modules\express\lib\router\route.js:119:3)
at Layer.handle [as handle_request] (D:\Tempthrusday\server\node_modules\express\lib\router\layer.js:95:5)
at D:\Tempthrusday\server\node_modules\express\lib\router\index.js:284:15
at Function.process_params (D:\Tempthrusday\server\node_modules\express\lib\router\index.js:346:12)
at next (D:\Tempthrusday\server\node_modules\express\lib\router\index.js:280:10)
at authenticateJWT (D:\Tempthrusday\server\api\middlewares\authenticate.middleware.js:46:5)
at Layer.handle [as handle_request] (D:\Tempthrusday\server\node_modules\express\lib\router\layer.js:95:5)
Now we have a different issue! The error is still occurring at the line where it's trying to access req.body.title, but we can see the user ID is being correctly extracted.
This suggests the problem is with the request body parsing. Here are the steps to fix it:
Make sure you have the JSON body parser middleware correctly set up in your main app file:
// In your app.js or server.js file
import express from 'express';
import bodyParser from 'body-parser'; // If you're using an older version of Express
const app = express();
// Make sure this is BEFORE your routes
app.use(express.json()); // For Express 4.16.0 and higher
// OR if using body-parser:
// app.use(bodyParser.json());
// Then your routes
app.use('/api/documents', documentRoutes);export const createDocument = async (req, res) => {
try {
console.log("Creating document for user:", req.user?._id);
console.log("Request body:", req.body); // Log the entire request body for debugging
// Check if req.body exists
if (!req.body) {
console.error("Request body is undefined");
return res.status(400).json({
error: "Invalid request - missing request body",
details: "The request body is undefined"
});
}
// Safely extract title and content with defaults
const title = req.body.title || "Untitled Document";
const content = req.body.content || "";
console.log("Document data:", { title, contentLength: content.length || 0 });
const document = await Document.create({
title,
content,
owner: req.user?._id,
lastEdited: new Date(),
});
console.log("Document created:", document._id);
return res.status(201).json({
success: true,
document: {
id: document._id,
title: document.title,
content: document.content,
lastEdited: document.lastEdited,
},
});
} catch (error) {
console.error("Create document error:", error);
return res.status(500).json({
error: "Failed to create document",
details: String(error),
});
}
};Make sure your Postman request:
Content-Type: application/json headerExample of a correct Postman setup:
Headers:
Body:
{"title": "Test Document", "content": "Test content"}If you're still having issues, try this very simple test to isolate the problem:
// Add this to your routes file
app.post('/api/test-body', (req, res) => {
console.log('Test body route hit');
console.log('Request headers:', req.headers);
console.log('Request body:', req.body);
res.json({
success: true,
receivedBody: req.body,
bodyExists: !!req.body,
contentType: req.headers['content-type']
});
});Then make a simple POST request to this endpoint with a JSON body to see if body parsing is working at all.
Let me know if any of these solutions help!
You can send messages while the preview loads