node.js 仅表达与用户相关的 return 个元素

node.js express only return elements related to the user

我只想return属于当前登录用户的交易。我将用户存储在每个请求的 header 中。在每笔交易中,我都存储了创建者。

我的 GET 方法如下所示:

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!",
      });
    });
};

我尝试在控制台中手动记录我在过滤器中比较的两个属性,并且实际上存在两者相同的交易。 但是 fetchTrades 仍然是空的。

我真的很感激一些想法。

以下是两个模型:

user.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);

trade.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);

编辑: 这就是交易的样子:

{
  _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
}

编辑2: 感谢@vicki。我不得不在我的过滤器函数中使用“==”而不是“===”。

您对过滤功能的使用有误。您 return 没有匹配的条目。

tradeQuery
.then((trades) => {
  fetchTrades = trades.filter((t) => t.creator._id === req.userData.userId);
  return;
})

这是您的用法。改成

tradeQuery
.then((trades) => {
  fetchTrades = trades.filter((t) => return t.creator._id === req.userData.userId);  
})

这应该可以解决您的问题。添加一个 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)

编辑: 比较 ObjectID 时可能会出现问题,使用 === 也会进行类型检查。因此,建议使用 t.creator._id.equals(req.userData.userId)==。 正如@ApoorvaChikara 指出的那样,不要在过滤器函数中使用 return 语句。

帮助我完成过滤的是 mongoose find() 方法。您可以传入要与用户标识匹配的字段。为了做到这一点,我实现了一个导出所有数据库查询函数的存储库文件。在我的例子中,我想从特定用户那里获取所有时间段。

我的 period.repo.ts 看起来像这样:

// period.repo.ts
import Period from '../models/period.model';
 
class PeriodRepository {
  findAllFromUser(userId: String) {
    return Period.find({ userId: userId });
  }
   
}
    
export default new PeriodRepository();

然后在包含我的后端业务逻辑的服务文件中,我导入并使用 repo 文件,如下所示:

// 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',
        });
      });
  }

这样我只查询属于所选用户的文档。