Solo quiero devolver las transacciones que pertenecen al usuario actualmente conectado. Guardo el usuario dentro del encabezado de cada solicitud. En cada oficio tengo guardado el creador.
Mi método GET se ve así:
exports.getTrades = (req, res, next) => { const tradeQuery = Trade.find(); let fetchTrades; tradeQuery .then((trades) => { fetchTrades = trades.filter((t) => t.creator._id === req.userData.userId); <--- return; }) .then((count) => { res.status(200).json({ message: "Trades fetched successfully!", trades: fetchTrades, }); }) .catch((error) => { res.status(500).json({ message: "Fetching trades failed!", }); }); };Intenté registrar en la consola los dos atributos que comparo dentro de mi filtro manualmente, y en realidad hay intercambios en los que ambos son iguales. Sin embargo, fetchTrades permanece vacío.
Realmente agradecería algunas ideas.
Aquí están los dos modelos:
usuario.js:
const mongoose = require("mongoose"); const uniqueValidator = require("mongoose-unique-validator"); const userSchema = mongoose.Schema({ email: { type: String, required: true, unique: true }, password: { type: String, required: true }, }); userSchema.plugin(uniqueValidator); module.exports = mongoose.model("User", userSchema);comercio.js:
const mongoose = require("mongoose"); const tradeSchema = mongoose.Schema({ pair: { type: String, required: true }, type: { type: String, required: true }, resultAmount: { type: Number, required: true }, date: { type: Date, required: true }, time: { type: Date, required: true }, creator: { type: mongoose.Schema.Types.ObjectId, ref: "User", required: true, }, leverage: { type: Number }, entry: { type: Number }, exit: { type: Number }, lessonLearned: { type: String }, }); module.exports = mongoose.model("Trade", tradeSchema);EDITAR: así es como se ve el comercio:
{ _id: 6245bf565043276fb456cb6a, pair: 'BTCUSD', type: 'long', resultAmount: 239, time: 2022-03-22T23:00:00.000Z, date: 2022-03-31T14:48:28.916Z, creator: 62409c68e17cae2d68a99b3b, leverage: 20, entry: 1.2321, exit: 1.2377, lessonLearned: 'I was good man', __v: 0 }EDIT2: Gracias a @vicki. Tuve que usar "==" en lugar de "===" dentro de mi función de filtro.
Hay un error en el uso de la función de filtro. No devuelve nada en lugar de entradas coincidentes.
tradeQuery .then((trades) => { fetchTrades = trades.filter((t) => t.creator._id === req.userData.userId); return; })Este es su uso. cambiarlo como
tradeQuery .then((trades) => { fetchTrades = trades.filter((t) => return t.creator._id === req.userData.userId); })Esto posiblemente debería solucionar su problema. Agregar un fragmento js
let trades = [{ "id": 1, "name": 'asd' }, { "id": 2, "name": 'qwe' }, { "id": 1, "name": 'efg' }] let fetchTrades { fetchTrades = trades.filter((t) => { t.id === 1; return }) } console.log('improper usage',fetchTrades) { fetchTrades = trades.filter((t) => { return t.id === 1; }) } console.log('Proper usage',fetchTrades) EDITAR: Puede haber problemas al comparar ObjectID, usar === también verificará el tipo. Por lo tanto, es recomendable usar t.creator._id.equals(req.userData.userId) o == . Como señaló @ApoorvaChikara, no use la declaración de devolución dentro de la función de filtro.
lo que me ayudó a realizar el filtrado es el método mongoose find(). puede pasar un campo que desee hacer coincidir con un ID de usuario. para hacer esto, implementé un archivo de repositorio que exporta todas las funciones de consulta de db. en mi caso, quiero obtener todos los períodos de un usuario específico.
mi period.repo.ts se ve así:
// period.repo.ts import Period from '../models/period.model'; class PeriodRepository { findAllFromUser(userId: String) { return Period.find({ userId: userId }); } } export default new PeriodRepository();luego, en mi archivo de servicio que contiene mi lógica comercial para el backend, importo y uso el archivo de repositorio de esta manera:
// period.service.ts import PeriodRepository from './period.repository'; getCycle(req, res) { let cycleLength = 1; let lastPeriod; PeriodRepository.findAllFromUser(req.params.userId) .then((periods) => { cycleLength = periodHelper.calcAverageCycleLength(periods, 0); if (lastPeriod?.endDate) { return res.status(200).json({ message: 'predictions fetched', cycleLength: cycleLength, }); } else { return res.status(200).json({ message: 'period is active', remainingDaysPeriod: 0, remainingDaysOvaluation: 0, }); } }) .catch((error) => { return res.status(500).json({ message: 'fetching periods failed', }); }); }de esta manera solo consulto los documentos que pertenecen al usuario seleccionado.