2016-04-19 5 views
0

У меня есть сайт, на котором пользователь хранит ресурсы и делает статьи о них. В настоящее время я создаю раздел комментариев, в котором пользователи могут делать комментарии в статьях. У меня есть запрос put, который запускается от контроллера, который отправляет идентификатор статьи и комментарий.PUT Ошибка анализа запроса

, но я получаю следующее сообщение об ошибке,

SyntaxError: Unexpected token 1 
    at parse (/home/themis/webappionio/node_modules/body-parser/lib/types/json.js:83:15) 
    at /home/themis/webappionio/node_modules/body-parser/lib/read.js:116:18 
    at invokeCallback (/home/themis/webappionio/node_modules/raw-body/index.js:262:16) 
    at done (/home/themis/webappionio/node_modules/raw-body/index.js:251:7) 
    at IncomingMessage.onEnd (/home/themis/webappionio/node_modules/raw-body/index.js:308:7) 
    at emitNone (events.js:67:13) 
    at IncomingMessage.emit (events.js:166:7) 
    at endReadableNT (_stream_readable.js:905:12) 
    at doNTCallback2 (node.js:441:9) 
    at process._tickCallback (node.js:355:17) 

вот мой server.js:

//defining Articles Model 

var ArticleSchema = mongoose.Schema({ 
    _creatorname: String, 
    title : String, 
    body : String, 
    resource: String, 
    published : String, 
    comments: [{ 
     _commentorname: String, 
      content : String, 
      date : String 
    }] 
}); 

var Articles = mongoose.model("Articles", ArticleSchema); 

//pushing comment into the specific article 

app.put("/home/:id", function(req,res){ 
    var _commentorname = req.user.username; 
    var content = req.body.comment; 
    var date = moment().tz("Europe/Athens").format("DD/MM/YY HH:mm"); 
    Articles.findByIdAndUpdate(
     id, 
     {$push: {"comments" : {_commentorname: _commentorname, content: content, date: date}}}, 
     {safe: true, upsert: true, new : true}, 
     function(err, article) { 
       console.log(err); 
     } 
    ); 
}); 

Мой контроллер:

$scope.addComment = function(id, comment) { 
     console.log(id); 
     console.log(comment); 
     $http.put("/home/" + id, comment) 
     .success(function(response){ 
      $scope.all(); 
     }); 
    }; 

и мой HTML форма:

<div class="panel-footer"> 
         <input type="text" id="userComment" ng-model="comment" class="form-control input-sm chat-input" placeholder="Write your message here..." /> 
         <span class="input-group-btn">  
          <button class="btn btn-primary btn-sm" ng-click="addComment(article._id, comment)"><span class="glyphicon glyphicon-comment"></span> Add Comment</button> 
         </span> 

        </div> 

Вот мой окончательный server.js

app.put("/home/:id", function(req,res){ 
    var id = req.params.id; 
    Articles.findByIdAndUpdate(
     id, 
     {$push: {"comments" : {_commentorname: req.user.username, content:req.body.comment}}}, 
     {safe: true, upsert: true, new : true}, 
     function (err, results) { 
      if (err) 
      { 
       res.send("there was a problem updating the information: " + err); 
      } 
      else { 
       res.format({ 
        json: function() { 
         res.json(results); 
        } 
       }); 
      } 
     } 
    ); 
}); 
+1

Это поможет, если вы научились интерпретировать стек следы немного лучше. Источник ошибки исходит из «парсера тела», что означает, что отправленный отформатированный JSON имеет структурную ошибку. Это также помогает понять, что только потому, что вы «проект» использует различные компоненты технологии в стеке, это не значит, что ваша «проблема» или «вопрос» здесь включает в себя «все» из них. Обычно предполагается, что вы сначала сушите эти вещи и спросите и отметьте их соответствующим образом. –

ответ

1

Проблема заключается в том, что comment здесь фактически не отправляется как Object но так же, как «строка». Поэтому вам нужно создать структуру Object.

Так правильно угловой код контроллера:

$scope.addComment = function(id, comment) { 
     console.log(id); 
     console.log(comment); 
     $http.put("/home/" + id, { "comment": comment}) 
     .success(function(response){ 
      $scope.all(); 
     }); 
    }; 
+0

@ExWei Вы также ошиблись, и вам сказали, что вы ошиблись –

+0

хорошо это сработало: я нажал на объект, как сказал Блейк выше. я нажал все, что мне хотелось, кроме формата даты, который, если я попытаюсь нажать дату также, ничего не нажал на всех –

+1

@Nickbo Ну, на самом деле нет причин, почему это было бы проблемой. Тип вашей схемы в настоящее время является «String» для свойства «date», поэтому он должен просто строчить. Я лично думаю, что вы должны хранить как «Date» вместо этого, а также не пытаться заставить строку в локальный часовой пояс. Но это не то, о чем был связан вопрос или ошибка. Не забудьте [Принять свои ответы] (http://stackoverflow.com/help/accepted-answer). Поскольку я замечаю, что вы еще не приняли его. –

-1

Новый Ответ:

На самом деле, похоже, что вы подаете в угловом контроллер комментария переменной в «сырой» способ вместо отправки это, как JSON, вам необходимо изменить его на

$scope.addComment = function(id, comment) { 
     console.log(id); 
     console.log(comment); 
     $http.put("/home/" + id, {comment: comment}) 
     .success(function(response){ 
      $scope.all(); 
     }); 
    }; 

Старый Ответ:

Я думаю, что это порождает ошибку, потому что вы форматируете дату в необычный формат «DD/MM/YY HH: mm», если вы используете собственный объект JS, он будет работать, например.

var date = moment().tz("Europe/Athens").toDate() 
Смежные вопросы