#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) был сохранен, но внутри его собственного массива, извините, если мой первоначальный вопрос был неясен, я все еще новичок в этом