Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
2 / 2 / 0
Регистрация: 03.11.2019
Сообщений: 31

patch запрос через Express.js к MongoDB

07.10.2020, 14:52. Показов 1841. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Надеюсь, создал тему там, где надо. Если нет, то пардон. Не смог подобрать раздела.

Помогите пжлст разобраться.

В базе данных (Mongo) есть несколько документов. Например:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
_id:5f7d8542da1e433080e095c8
name:"Fedya"
phone:"5555555"
 
_id:5f7d857eda1e433080e095c9
name:"Vasya"
phone:"4444444"
 
 
_id:5f7d8543da1e433080e095a0
name:"Olya"
phone:"666666"
Мне нужно по запросу с фронта менять данные (например, имя).

Вот мой контроллер:

JavaScript
1
2
3
4
5
6
7
module.exports.editContact = (req, res, next) =>
  contact
    .findById(req.params.contactId)
    .orFail(new NotFoundError('Контакт не найден'))
    .then(() => contact.updateOne({ name: req.body.name }))
    .then(() => res.send({ message: 'Контакт  изменен' }))
    .catch(next);
Запрос отправляю на http://localhost:3000/contacts... 3080e095c9 (это id второго документа)

Но имя меняется у самого первого документа, верхнего.

Что я делаю не так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2020, 14:52
Ответы с готовыми решениями:

Mongodb, Mongoid как ускорить запись данных в Mongodb
Добрый вечер всем! Мне нужно записать в Mongodb 2.000.000 рядов информации, по очереди, один за одним, перед записью програма проверяет...

Добавление в mongoDB через цикл
function list(){ var obj = JSON.parse(fs.readFileSync('public/tasks.json', 'utf8')); ...

Вывод данных из MongoDB через Mongoose
Я в своем приложении делаю локализацию, меня есть база данных в приложении с языковыми константами. Суть в том, что идет подключение к...

5
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
07.10.2020, 19:40
Tenderfoot, updateOne принимает два аргумента: 1 - фильтр, по которому искать документ, 2 - изменения, которые нужно применить на документ.

JavaScript
1
contact.updateOne({ name: req.body.name }))
здесь contact не узнает магически какой документ обновить, вам нужно сделать так:

JavaScript
1
contact.updateOne({_id: req.params.contactId}, {$set: {name: req.body.name}})
1
413 / 304 / 113
Регистрация: 28.08.2013
Сообщений: 805
07.10.2020, 19:47
1. updateOne принимает ДВА параметра. Первый - условия поиска документа. Второй - что и чем обновляем. Если первый параметр нельзя привести к ObjectId, тогда Mongoose работает с первым документов, так как с каким именно документом работать не указано.
2. Методы обновления данных всегда состоят из двух (как минимум) входных параметров, чтобы не делать два запроса в БД. В твоём случае findById не нужен.
1
Всегда онлайн
 Аватар для MrOnlineCoder
1084 / 788 / 295
Регистрация: 07.04.2013
Сообщений: 2,703
07.10.2020, 19:56
Цитата Сообщение от kidASM Посмотреть сообщение
2. Методы обновления данных всегда состоят из двух (как минимум) входных параметров, чтобы не делать два запроса в БД. В твоём случае findById не нужен.
однако если документа с запрашиваемым ID не будет найдено, то updateOne молча выполниться с nModified: 0 и уже API вернет результат "Контакт изменен", вместо ожидаемого "Контакт не найден."
1
413 / 304 / 113
Регистрация: 28.08.2013
Сообщений: 805
07.10.2020, 20:15
Так в любом случае проверять надо что база вернула.
1
2 / 2 / 0
Регистрация: 03.11.2019
Сообщений: 31
08.10.2020, 13:56  [ТС]
Спасибо вам, господа! Как же сам не додумался то?))) Ведь целый день бился и документацию читал...

Вот так в итоге работает:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
module.exports.editContact = (req, res, next) => {
  if (!mongoose.Types.ObjectId.isValid(req.params.contactId)) {
    throw new BadRequest('Некорректный ID');
  }
  contact
    .findById(req.params.contactId)
    .orFail(new NotFoundError('Контакт не найден'))
    .then((e) => contact.updateOne(e, { name: req.body.name, phone: req.body.phone }))
    .then(() => res.send({ message: 'Контакт  изменен' }))
    .catch(next);
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2020, 13:56
Помогаю со студенческими работами здесь

Как открыть файл из mongoDB через Vue.js?
Добрый день, коллеги. Столкнулся с проблемой не понимания, как это работает. Вот код, который через postman выводит изображение. ...

как реализовать аутентификацию на mongodb используя gem devise (mongodb + Rails + devise)
как реализовать аутентификацию в mongodb используя gem devise? в роутах у меня есть devise_for :user; когда пишу в rake routes, то...

Запрос к MySQL. Через WorkBench запрос выполняется, а через клиента - нет
Добрый день! Помогите с запросом! string CommandText = "SELECT * FROM sensors WHERE sensors.VehID=1001317"; ...

Express middleware запускается несколько раз за один запрос
Здраствуйте, друзья! Где то у книге читал что если размещать промежуточною функцию до розмищения статики то при вызовах к папке паблик...

Express. Как перенаправить запрос к статическому файлу, не применяя redirect?
Всем привет. Нужно, чтобы при поступлении запроса с url "/" загружалась страница "/public/spa.html". Можно ли это как-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru