Ошибка MongooseError [CastError]: ошибка приведения к строке для значения «{}» в пути «userData.email» для модели «заказ»

#javascript #node.js #angular #rest

#javascript #node.js #угловой #rest

Вопрос:

Я хочу получать заказы на поиск пользователя по электронной почте: «admin», и я получаю сообщение об ошибке:

MongooseError [CastError]: ошибка приведения к строке для значения «{}» в пути «userData.email» для модели «order».

И я не получаю никакого ответа.

серверная часть — js — файл:

 router.get('/user-orders', (req, res) => {
  const user = req;
  Order.find({ "userData.email": user }, (error, order) => {
    if (error) {
      console.log(error);
    } else {
      return res.json({ order });
    }
  })
})
 

интерфейс — сервис:

  userOrders(user) {
    return this.http.get<User>(this.userOrdersUrl, user);
  }
 

файл интерфейса — ts:

   constructor(private orderService: OrderService, private router: Router) {
    this.orderService.userOrders('admin').subscribe(
      res => console.log(res),
      err => console.log(err)
    );
  }
 

Если я объявляю «пользователь» в бэкэнде — все работает хорошо:

 router.get('/user-orders', (req, res) => {
  const user = 'admin';
  Order.find({ "userData.email": user }, (error, order) => {
    if (error) {
      console.log(error);
    } else {
      return res.json({ order });
    }
  })
})
 

введите описание изображения здесь

Но я должен отправить строку ‘admin’ из интерфейса. Как это исправить?

Редактировать:

модель заказа:

 const orderSchema = new Schema({
    userData: {
        firstname: String,
        lastname: String,
        address: String,
        postcode: Object,
        city: String,
        country: String,
        email: String,
        phone: Number
    },
    items: {},
    shipping: String,
    sum: Number,
    created: {
        type: Date,
        default: Date.now()
    },
    status: {
        type:String,
        default: 'order_placed'
    }
});
 

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

1. поделитесь, пожалуйста, своей моделью?

2. ооо, это кажется простым: const user = req; эта строка неверна, вам нужно что-то вроде req.body.user; как вы передаете пользователя на серверную часть?

3. Я отредактировал свой вопрос и добавил модель заказа. Я сменил user на user = req.body.user; — теперь ошибки нет, но я получаю пустой массив заказов. В моем вопросе есть код интерфейса, в котором я отправляю пользователя (‘admin’) на серверную часть.

4. Я не знаю angular, но это: userOrders(user) { return this.http.get<User>(this.userOrdersUrl, user); } похоже на запрос get на localhost/ user /someID если вы передаете информацию на серверную часть, то в express вы извлекаете эту информацию следующим образомэто: req.params.someID router.get(‘/ user-orders’, (req, res) => {} эта строка мне показалась, что в express вы бы сделали что-то вроде router.get(‘/user-orders/:userId’, (req, res) => { пусть user = req.params.userId })

5. Я не получаю идентификатор пользователя. UserOrdersUrl — это обычный путь — ‘ localhost:3000/api/cart/user-orders ‘. А «(user)» в параметре — это просто строка «admin». Спасибо за попытку помочь, к сожалению, я не понимаю вашего решения, кроме того, оно не работает, если я не получаю идентификатор пользователя из path .

Ответ №1:

Я бы изменил ваш маршрутизатор, чтобы ожидать идентификатор пользователя / адрес электронной почты в URL-адресе в качестве параметра пути, который express затем заполнит в req.params

 router.get('/user-orders/:id', (req, res) => {
   Order.find({ "userData.email": req.params.id}, (error, order) => { ... });
}
 

Затем в вашем интерфейсе вам нужно настроить URL на что-то вроде:

 userOrders(userIdOrEmail) {
   return this.http.get<User>(`${this.userOrdersUrl}/${userIdOrEmail}`);
}