2015-10-11 2 views
0

My studentApi.js выглядит следующим образом. Router.param() используется для сохранения кода для повторения снова и снова.Как вызвать node.js api из углового?

router.param('post', function (req, res, next, id) { 
    var query = Post.findById(id); 
    query.exec(function (err, post) { 
     if (err) { return next(err); } 
     if (!post) { return next(new Error('Can\'t find post')); } 
     req.post = post; 
     return next(); 
    }) 
}); 
router.put('/posts/:post/upvote', function (req, res, next) { 
    res.post.upvote(function (err, post) { 
     if (err) { return next(err);} 
    }); 
}); 

В угловой Я звоню как

o.upvote = function (post) { 
     return $http.put('/studentapi/posts/' + post._id + '/upvote') 
      .success(function (data) { 
       alert("post voted"); 
       post.upvotes += 1; 
      }); 
    }; 

Ошибка: enter image description here

Моя модель выглядит следующим образом, вызывая upvote метод внутренне от модели.

var mongoose = require('mongoose'); 
var PostSchema = new mongoose.Schema({ 
    title: String, 
    link: String, 
    upvotes: { type: Number, default: 0 }, 
    downvotes: { type: Number, default: 0 }, 
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] 
}); 

mongoose.model('Post', PostSchema); 

PostSchema.methods.upvote = function (cb) { 
    this.upvotes += 1; 
    this.save(cb); 
} 

enter image description here

+0

является вашим api и работает? И в вашем studentApi.js есть только «post /: post», где код, инициализирующий его «/ studentapi»? Возможно, вам не хватает инициализации. Попробуйте PUT на "/ posts /" без "studentapi". Или у вас есть «/ studentApi», а не «studentapi» –

+0

Yup, api работает, уже работая с простым запросом на получение. Я получаю запись из db и успешно свяжусь. В этом случае я обновляю запись, я передаю параметр, как указано выше, но 404. –

+0

studentApi.js, похоже, выполняется на стороне сервера с узлом, поэтому alert() не должен существовать, кроме случаев, когда вы импортируете функцию с тем же именем. Тогда, что такое res.post, это модель, связанная с mongodb? И, наконец, что у вас на консоли узла? – KyleK

ответ

1

Спасибо за всю помощь была действительно оценена, На самом деле там была ошибка в Mongoose модели в моем случае posts.js как мне нужно для присоединения модели после определения метода в модели Post. Правильные один был

var mongoose = require('mongoose'); 
var PostSchema = new mongoose.Schema({ 
    title: String, 
    link: String, 
    upvotes: { type: Number, default: 0 }, 
    downvotes: { type: Number, default: 0 }, 
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] 
}); 

PostSchema.methods.upvote = function (cb) { 
    this.upvotes += 1; 
    this.save(cb); 
} 

mongoose.model('Post', PostSchema); 

Как сейчас я поставил PostSchema.methods.upvote материала над mongoose.model ('Post', PostSchema);

+0

рад видеть, что у вас это получилось. Вы теперь получаете ожидаемое поведение, поскольку добавили свойства в класс post до объявления модели? –

+0

@ChrisL yup, именно сейчас он отлично работает;) –

2

How do I update/upsert a document in Mongoose?

Вот хороший старт. Я лично использую следующий подход, рекомендованный в scotch.io

app.put('url', function(req, res) { 

    // use our bear model to find the bear we want 
    Bear.findById(req.params.bear_id, function(err, bear) { 

     if (err) 
      res.send(err); 

     bear.name = req.body.name; // update the bears info 

     // save the bear 
     bear.save(function(err) { 
      if (err) 
       res.send(err); 

      res.json({ message: 'Bear updated!' }); 
     }); 

    }); 
}); 

https://scotch.io/tutorials/build-a-restful-api-using-node-and-express-4

+0

Yup, я могу сделать это по вышеуказанному коду, но я действительно хочу повторно использовать код, по крайней мере, для getById. –

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