#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}`);
}