2013-11-14 2 views
0

У меня проблема с моим REST API. Он не будет правильно общаться с mongodb. Node.js бросок следующее исключение:REST API (Mongo DB) Аргументы Ошибка 500

Ошибка: Аргумент передается в должно быть одной строки из 12 байтов или строку из 24 шестнадцатеричных символов

Мой менеджер выглядит как следующим образом:

app.get('/users/:id', function(req, res) { 
userProvider.fetchUserById(req.params.id, function(error, user) { 
    if (user == null) { 
    res.send(error, 404); 
    } else { 
    res.send(user); 
    } 
}); 

}) ;

Мой провайдер выглядит следующим образом:

this.fetchUserById = function(id, cb) { 
this.db.collection(usersTable, function(error, users) { 
    if (error) { 
    cb(error, null); 
    } else { 
    users.findOne({ 
     _id:users.db.bson_serializer.ObjectID.createFromHexString(id) 
    }, function(error, result) { 
     cb(error, result); 
    }); 
    } 
}); 

};

Мой Mongoobject выглядит следующим образом:

{ "название": "название", "GivenName": "Vorname", "LastName": "Nachname", "имя" : «Vorname Nachname " "имя пользователя": "Авторизация Логин", "пароль": "Kennwort", "электронная почта": "[email protected]", "телефон": "0000 - 000000", "факс":" 000000 - 000000 ", " lastlogin ":" 15.11.2013 ", " createdate ":" 15.11.2013 ", " changeate ":" 15.11.2013 ", "состояние": "1", "_ID": ObjectId ("5283fbf56e3adb01f1000001") }

Когда я теперь отправить GET:/Пользователи/1 ошибка будет выброшен.

Я новый в Node.js. :-)

+0

OK, когда я использую ObjectID = 5283fbf56e3adb01f1000001, он будет работать. Но я буду использовать читаемый человеком идентификатор. Это возможно? – electron23

ответ

0

Если ваши человекообразные идентификаторы уникальны, вы можете их использовать.

Просто вставьте документы с красивым ID:

db.users.insert({ _id: myVeryNiceUniqueId, title: '...' }, ...); 

качестве альтернативы, вы можете добавить дополнительный «внешний идентификатор» к документу и создать уникальный индекс. Но у вас будет много и много проблем, если вы хотите масштабировать (заштриховывать). Кто собирается создавать уникальные идентификаторы? Я обещаю, что у вас будет что-то не-человеческое.

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

In Mysql I have start the Ids from 5XXXX and used them. How can I realize this with mongodb

Вы должны задать другой вопрос или поиска ответов. Это не тривиальная задача, и вам нужно учитывать параллелизм. Может быть, концепция findAndModify или «Upsert» может вам помочь. Одна из самых важных вещей заключается в том, что вам нужен способ получения атомных обновлений для ID-генератора. В одном проекте в прошлом я использовал Redis, но с тех пор я всегда использую идентификаторы MongoDB. Вы должны знать, что идентификаторы объектов MongoDB обычно генерируются клиентом-драйвером. Для служб REST это идеально: сохранить документ в БД и вернуть статус 201 Создано, url = .../user/98357348957.

btw. should I generate the OrderIDs in Javascript by checking the highest value of an external id in the collection?

Как уже говорилось, вы можете попасть в неприятности с использованием дублирующих идентификаторов, когда ваш сервер находится в высокой конкуренции. Попробуйте найти решение с findAndModify или кешируйте блок идентификаторов и используйте их в одном процессе.Я, вероятно, не буду искать max и increment, а использовать специальную коллекцию для ID-управления.

What is here best practice?

Не знаю. Использование ID-генератора. Зависит от вашего окружения (одиночный процесс, одиночная машина). Если это простая настройка, вы найдете простые решения. Настройка для Twitter не проста, и они разработали решение под названием twitter/snowflake. Если вам действительно нужны очень красивые короткие идентификаторы, но у вас есть несколько процессов/машин, Redis может захотеть вас захотеть. И если идентификатор не обязательно должен быть смежным (без небольших пробелов), вы можете нарисовать кучу новых идентификаторов (например, 100) и кэшировать их для будущего потребления за процесс.

Can I hash the objectID to an 5 digit number?

Нет, нет гарантий, что это число уникально.

+0

Спасибо, что я нашел это! Но уникальные идентификаторы, подобные объектам, я думаю, были хорошими. Я портирую приложение заказа на node.js и генерирую и сохраняю номера заказов. В Mysql я запускаю идентификаторы из 5XXXX и использовал их. Как я могу реализовать это с помощью mongodb btw. следует ли генерировать идентификаторы OrderID в Javascript, проверяя наибольшее значение внешнего идентификатора в коллекции? В чем здесь лучшая практика? Могу ли я хэш-идентификатор объекта на 5-значный номер? – electron23

Смежные вопросы