Есть несколько вещей здесь, которые не являются большими, но первым, чтобы покрыть основы и получить ты.
Первое, что нужно исправить метод, вызывающий угловую сторону обслуживания. Конечная точка API, конечно же, не ожидает синтаксиса обновления MongoDB, который вы используете, а скорее всего как объект. Поэтому первое, что фиксируя:
$scope.saveComment = function(i){
console.log("id is " + i);
// Split these out so they are easy to log and debug
var path = '/api/its' + i;
// This must mirror the structure expected in your document for the element
// Therefore "comments" is represented as an array of objects, even
// where this is only one.
var data = {
comments: [{
words: $scope.comment,
userId: $scope.getCurrentUser().name
}]
};
// Call service with response
$http.put(path,data).success(function(stuff){
document.location.reload(true);
});
}
Теперь ваш конечный API-сервер имеет некоторые недостатки, я предпочел бы полную модернизацию, но в отсутствие информации, просто сосредоточиться на решении основных проблем, не меняя много.
Предполагая, что это библиотека lodash, функция .merge()
реализована неправильно. Нужно сказать, как правильно обрабатывать содержимое массива в «слиянии», и в настоящее время лучшее, что произойдет, это «перезаписать». Таким образом, мы даем ему несколько СМАРТС:
// Updates an existing it in the DB.
exports.update = function(req, res) {
if(req.body._id) { delete req.body._id; }
It.findById(req.params.id, function (err, it) {
if (err) { return handleError(res, err); }
if(!it) { return res.send(404); }
var updated = _.merge(it, req.body,function(a,b) {
if (_.isArray(a)) {
return a.concat(b); // join source and input
}
});
updated.save(function (err) {
if (err) { return handleError(res, err); }
return res.json(200, updated);
});
});
};`
Но есть загвоздка, что, как только будет «добавить» в массив. Поэтому, если вы поместите что-то в свой вход, который уже был там, будут добавлены как исходные элементы, так и все, что было бы в массиве.
Работа с этим - это еще одна проблема для разработки, в зависимости от ваших потребностей.
С моей собственной точки зрения, я просто отправлю массив там, где это возможно, и имел бы конечную точку, которая «просто» для добавления к массиву документа, а не «общее» обновление документа, как вы здесь.
Это позволяет вам лучше использовать функции обновления MongoDB за каждый ожидаемый результат. Так что-то вроде этого в вызове службы:
// comment can just be a singular object now
$http.put(path,{
"words": "this that",
"userId": 123
}).success(function(stuff){
А на стороне сервера API:
exports.addComment = function(req, res) {
if(req.body._id) { delete req.body._id; }
It.findByIdAndUpdate(req.params.id,
{ "$push": { "comments": req.body } },
{ "new": true },
function(err,it) {
if (err) { return handleError(res, err); }
if(!it) { return res.send(404); }
return res.json(200, it);
}
);
};
Так что просто взять тело «комментарий» и добавить его в массив. Самое главное, что это происходит «атомарно», так что никакой другой возможный запрос не может столкнуться при выполнении чего-то вроде текущего «слияния». Другие запросы к одной и той же конечной точке будут просто «добавляться» к массиву в текущем состоянии, как при выполнении запроса, и так будет.
Для этого нужен оператор $push
, поэтому разумно его использовать.
Некоторые блюда для размышления.
Какова ваша конечная точка API? Кажется, это ваше собственное серверное приложение, и что он должен получать на этой конечной точке для запроса PUT? –
«i» в аргументе функции - это MongoDB '_id' для определенного сообщения. Таким образом, конечная точка - это просто связанный объект JavaScript с кучей пар ключ/значение, один из которых является «комментариями» –
«Конечная точка» - это URL-адрес в вашем запросе i.e '/ api/its'. Что такое код сервера для этого метода? Это ваше собственное приложение или API-провайдер? Если последнее, то кто является провайдером? –