2015-07-28 2 views
2

Я пытаюсь добавить кучу комментариев в массив MongoDB с сервисом $ http от AngularJS, но, похоже, я зашел в тупик. Вот код, который я попробовал (который разбился мой DOM):Как нажать на массив MongoDB с помощью AngularJS?

$scope.saveComment = function(i){ 
     console.log("id is " + i); 
     $http.put('/api/its/' + i, { comments: {$push: { words: $scope.comment, userId: $scope.getCurrentUser().name } } }).success(function(stuff){ 
     document.location.reload(true); 
     }) 
    } 

Я пытался использовать $push метод MongoDB, чтобы сделать это, но Угловая не будет иметь. Есть ли какие-нибудь подсказки относительно того, как я могу это сделать?

С уважением,

Питер

P.S.

Вот код на стороне сервера для функциональности обновления этой конкретной модели:

// 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); 
    updated.save(function (err) { 
     if (err) { return handleError(res, err); } 
     return res.json(200, it); 
    }); 
    }); 
};` 
+0

Какова ваша конечная точка API? Кажется, это ваше собственное серверное приложение, и что он должен получать на этой конечной точке для запроса PUT? –

+0

«i» в аргументе функции - это MongoDB '_id' для определенного сообщения. Таким образом, конечная точка - это просто связанный объект JavaScript с кучей пар ключ/значение, один из которых является «комментариями» –

+0

«Конечная точка» - это URL-адрес в вашем запросе i.e '/ api/its'. Что такое код сервера для этого метода? Это ваше собственное приложение или API-провайдер? Если последнее, то кто является провайдером? –

ответ

4

Есть несколько вещей здесь, которые не являются большими, но первым, чтобы покрыть основы и получить ты.

Первое, что нужно исправить метод, вызывающий угловую сторону обслуживания. Конечная точка 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, поэтому разумно его использовать.

Некоторые блюда для размышления.

+1

Чувак ... не хочу звучать сырный, но как ты добрался до такой удивительной? Этот код болен, чувак! (для неверующих там, он работает точно так же, как я предвидел ~) Хотя сейчас я нахожусь на расписании (у меня есть «встречай и приветствуй», чтобы показать мою работу по загрузке, чтобы, может быть, я могу найти работу! #unemployed), когда я получу шанс, я более подробно рассмотрю библиотеку [lodash] (https://lodash.com/) и попытаюсь освоить второе предложение здесь. Спасибо, Блэйкс Семь! –

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