更新资源时遇到问题

时间:2020-12-30 17:38:10

标签: javascript node.js reactjs mongoose

我正在尝试更新一个事务,但它会更新该事务并同时删除其他事务。我的重点是只更新一笔交易。有人可以检查我的后端逻辑吗。

我的架构:

const mongoose = require('mongoose')

mongoose.Schema.Types.String.set('trim', true)

const transactionSchema = mongoose.Schema(
  {
    note: { type: String, required: true },
    amount: { type: Number, default: 0 },
    user: {
      type: mongoose.Schema.Types.ObjectId,
      required: true,
      ref: 'User',
    },
  },
  {
    timestamps: true,
  }
)

const WalletSchema = new mongoose.Schema({
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    required: true,
  },
  name: {
    type: String,
    trim: true,
    required: [true, 'Please enter a name'],
  },
  balance: {
    type: Number,
    default: 0,
  },
  transactions: [transactionSchema],
  createdAt: {
    type: Date,
    default: Date.now,
  },
})

module.exports = mongoose.model('Wallet', WalletSchema)

我的后端控制器逻辑:

exports.updateWalletTransactions = asyncHandler(async (req, res, next) => {
  const { amount, note } = req.body
  const foundWallet = await Wallet.findOne({ user: req.user.id })

  foundWallet.transactions = foundWallet.transactions.filter(
    (trans) => trans._id.toString() === req.params.id
  )

  if (foundWallet.transactions) {
    foundWallet.transactions[0].amount =
      amount || foundWallet.transactions[0].amount
    foundWallet.transactions[0].note = note || foundWallet.transactions[0]
    const updatedTransaction = await foundWallet.save()
    return res.status(200).json(updatedTransaction)
  } else {
    return next(new ErrorResponse('Transaction not found', 404))
  }
})

2 个答案:

答案 0 :(得分:0)

问题是您使用的 Array 的 filter 方法只会返回指定的交易。

更好的方法是使用 map 方法编写代码,如下所示:

exports.updateWalletTransactions = asyncHandler(async (req, res, next) => {
  const { amount, note } = req.body;
  const foundWallet = await Wallet.findOne({ user: req.user.id });

  if (!foundWallet) return next(new ErrorResponse("no wallet found", 404));

  const transIndex = foundWallet.transactions.findIndex(
    (trans) => trans._id.toString() === req.params.id
  );

  if (!transIndex) return next(new ErrorResponse("Transaction not found", 404));

  foundWallet.transactions = foundWallet.transactions.map((trans) => {
    if (trans._id.toString() === req.params.id) {
      trans.amount = amount || trans.amount;
      trans.note = note || trans.note;
    }
    return trans;
  });

  const updatedWallet = await foundWallet.save();
  const updatedTransactions = updatedWallet.transactions;
  return res.status(200).json(updatedTransactions);
});

或者你可以这样做:

exports.updateWalletTransactions = asyncHandler(async (req, res, next) => {
  const { amount, note } = req.body;
  const foundWallet = await Wallet.findOne({ user: req.user.id });

  if (!foundWallet) return next(new ErrorResponse("no wallet found", 404));

  const transIndex = foundWallet.transactions.findIndex(
    (trans) => trans._id.toString() === req.params.id
  );
  
  const trans = foundWallet.transactions[transIndex];
  
  if (trans) {
    trans.amount = amount || trans.amount;
    trans.note = note || trans.note;
  } else {
    return next(new ErrorResponse("Transaction not found", 404));
  }

  const updatedWallet = await foundWallet.save();
  const updatedTransactions = updatedWallet.transactions;
  return res.status(200).json(updatedTransactions);
});

答案 1 :(得分:0)

您正在覆盖交易。最好迭代每个交易并更新匹配的交易 ID。

exports.updateWalletTransactions = asyncHandler(async(req, res, next) => {
  const {
    amount,
    note
  } = req.body;
  const foundWallet = await Wallet.findOne({
    user: req.user.id
  })
  let transFound = false;
  if (foundWallet) {
    foundWallet.transactions.forEach(trans => {
      if (trans._id.toString() === req.params.id) {
        transFound = true;
        trans.amount = amount || trans.amount
        trans.note = note || trans.note
      }
    })
    if(transFound){
      const updatedTransaction = await foundWallet.save()
      return res.status(200).json(updatedTransaction)
    } else {
      return next(new ErrorResponse('Transaction not found', 404))
    }
  } else {
    return next(new ErrorResponse('User Id not found', 404))
  }
})