(узел: 17891) Необработанное предупреждение об отклонении: ошибка типа: NewPay.сохранение не является функцией

#node.js #mongoose

#node.js #мангуст

Вопрос:

консоль регистрирует пользователя, но всякий раз, когда я добавляю метод сохранения, я получаю сообщение об ошибке выше, любая помощь будет приятной enter code here , это мой контроллер;

  paymentPost: async(req, res, err)=>{
   let {plan, amount, payID} = req.body
   let userID = req.body
   userID = payID
   if(!payID || !plan || !amount){
    res.json({
      message: "all field required"
    })
   } else{
  await User.findOne({userID}).then(async(userId)=>{
     if(!userId || userID.length<9){
       res.status(400).json({
        message: "No user with this ID",
       })
     }else 
      await Payment.findOne({},async (err, payer)=>{
        if(!payer){
            let newPay = []
            newPay.push(new Payment({
            payID,
            amount,
            plan,
            status:true
      }))
      console.log(newPay)
      return newPay.save()
      .then(res.status(200).json({
        message: "Payment successfull",
        newPay
      }))
       }
     
   })
  }
 },
  

мне просто нужно, чтобы пользователь сохранял в базе данных

Комментарии:

1. Исправьте отступ. В этом коде отсутствуют фигурные скобки в if/else операторах. Вы также должны обновить свой вопрос, чтобы включить любые возникающие ошибки и результаты вашей отладки, то есть console.log . Вы должны указать, что вы на самом деле наблюдаете, когда выполняется ваш код, и желаемый результат.

Ответ №1:

Вы используете callbacks и async при том же вызове функции. Вы также ссылаетесь на массив newPay , который будет ограничен только функцией обратного вызова, и у массива нет вызываемой функции save .

Измените свою реализацию на нечто подобное приведенному ниже.

  const userId = await User.findOne({userID})
 if(!userId || userID.length<9) {
     return res.status(400).json({ message: "No user with this ID" });
 } else {
     const payer = await Payment.findOne({});
     if(!payer) {
        let payee = new Payment({ payID, amount, plan, status:true });
        await payee.save();
        return res.json({ message: "Payment successfull", newPay });
     }
     return res.json({ message: '?' }); // you also need to send a response here if not payer is found
 }
  

Если вы хотите отправить Payment экземпляр в массив для извлечения в последующих вызовах, просто добавьте push после создания экземпляра.

      if(!payer) {
        let payee = new Payment({ payID, amount, plan, status:true });
        await payee.save();
        payees.push(payee);
        return res.json({ message: "Payment successfull", newPay });
     }
  

Массив должен быть из внешнего контекста. т.Е. в вашей реализации область действия массива newPay ограничена функцией Payment.findOne обратного вызова.

Итак, за пределами вашей paymentPost функции (но где-то в области действия функции, которая должна будет выполнять поиск в массиве), вам нужно будет определить массив. Например

 //payees array is in scope of both paymentPost and paymentGet
const payees = [];
module.exports = {
     paymentPost: async () => {
         // implementation
         payees.push(payee);
     },

     paymentGet: async (id) => {
         return payees.find(payee => payee.payID === id);
     }
}
  

Комментарии:

1. да, я уже заставил это работать таким образом, но чего я действительно хочу добиться, так это сохранить платеж каждого уникального плательщика в его / ее собственном массиве NewPay, чтобы я мог запрашивать историю платежей каждого пользователя, если захочу

2. @MSadiq — Обновите свой вопрос — это не то, что вы спрашиваете "i just need the user to save to database"

3. конечно, я хочу, чтобы пользователь (NewPay) был сохранен, но внутри его собственного массива, извините, если мой первоначальный вопрос был неясен, я все еще новичок в этом