Me pregunto cómo usar el método .create() con una ruta protegida mientras uso JavaScript deconstruido. Sin la ruta protegida, puedo deconstruir mi esquema y usar req.body en .create(...) como se muestra a continuación.
const { title, year, producer, director, licenseStart, licenseEnd, platform, requestorName, requestorEmail, requestorDepartment, price, notes } = req.body Sin deconstruirlo, puedo hacerlo funcionar en .create() y .save() pero tiene 14-15 líneas y no se siente como la mejor práctica. Vea abajo.
const newPurchase = new Purchase({ user: req.user.id, title: req.body.title, year: req.body.year, producer: req.body.producer, director: req.body.director, licenseStart: req.body.licenseStart, licenseEnd: req.body.licenseEnd, platform: req.body.platform, requestorName: req.body.requestorName, requestorEmail: req.body.requestorEmail, requestorDepartment: req.body.requestorDepartment, price: req.body.price, notes: req.body.notes }); const savedPurchase = await newPurchase.save(); Mi problema es... ¿cómo diablos se deconstruyen las propiedades user:req.user.id y req.body y se usan ambas en el mismo método .create() ? .create(req.body) funciona, pero .create(req.body, { user: req.user.id }) no. He probado varias otras variaciones también.
Hola, no estoy muy seguro de lo que quieres decir con hacer que esto funcione:
.create(req.body, { user: req.user.id })Pero normalmente uso .create() así:
async function createUser(req, res) { const { firstName, lastName, gender, profilePicture, email, password } = req.body; try { const schema = object().keys({ firstName: string().required(), lastName: string().required(), gender: string().optional(), profilePicture: string().optional(), email: string().required(), password: string().required(), }); const validation = validate(req.body, schema); if (validation.error !== null) throw new Error(validation.error.details[0].message); const user = await User.findOne({ email }); if (user) { res.status(400).json({ success: false, message: "Email Already Exist" }); return; } const data = await User.create({ firstName, lastName, gender, profilePicture, email, password, lastLogin: new Date(), }); const newUser = await User.findById(data._id); res.json({ success: true, message: "user details", data: newUser, }); } catch (error) { console.error(error); res.json({ success: false, message: "user not found", error }); } }Espera que esto ayude
Descubrí la respuesta a mi propia pregunta. Pensé que había intentado esto antes, pero funcionó esta vez.
const setPurchases = asyncHandler(async (req, res) => { const {title, year, producer, director, licenseStart, licenseEnd, platform, requestorName, requestorEmail, requestorDepartment, price, notes} = req.body if (!title || !year || !producer || !director || !licenseStart || !licenseEnd|| !platform || !requestorName || !requestorEmail || !requestorDepartment || !price || !notes){ res.status(400) throw new Error('Please fill in all the fields') } **const purchase = await Purchase.create(Object.assign({user:req.user.id}, req.body));**Esto me permitió deconstruir el objeto Esquema de compra y usarlo tanto como el objeto de usuario en el método create(). Esto es mucho más limpio que el siguiente código y tiene usuario: req.user.id más 12 objetos req.body como title: req.body.title, name: req.body.name, year: year.req.body.year , productor... etc en el método .create(). El código de arriba es mucho más limpio que el de abajo y lo que he estado buscando. Espero que ayude a cualquier otra persona que tenga el mismo problema o a un novato como yo. También tenga en cuenta que también funciona con .save(), aunque un poco diferente como se muestra en mi pregunta original.
const setPurchases = asyncHandler(async (req, res) => { if (!title || !year || !producer || !director || !licenseStart || !licenseEnd|| !platform || !requestorName || !requestorEmail || !requestorDepartment || !price || !notes){ res.status(400) throw new Error('Please fill in all the fields') } const purchase = await Purchase.create({ title: req.body.title, year: req.body.year, producer: req.body.producer, director: req.body.director, licenseStart: req.body.licenseStart, licenseEnd: req.body.licenseEnd, platform: req.body.platform, requestorName: req.body.requestorName, requestorEmail: req.body.requestorEmail, requestorDepartment: req.body.requestorDepartment, price: req.body.price, notes: req.body.notes})