2014-01-28 4 views
2

Я этот отдых апи:Экспресс REST получить сообщение от слизняка

'use strict'; 

/** 
* Module dependencies. 
*/ 
var mongoose = require('mongoose'), 
    Post = mongoose.model('Post'), 
    _ = require('lodash'); 


/** 
* Find post by id 
*/ 
exports.post = function(req, res, next, id) { 
    Post.findOne({ '_id': id }, function (err, post) { 
     if (err) { 
      return next(err); 
     } 
     if (!post) { 
      return next(new Error('Failed to load post ' + id)); 
     } 
     req.post = post; 
     next(); 
    }); 
}; 

/** 
* Create a post 
*/ 
exports.create = function(req, res) { 
    var post = new Post(req.body); 
    post.save(function(err) { 
     if (err) { 
      res.jsonp(500,{ error: err.message }); 
     } else { 
      res.jsonp(post); 
     } 
    }); 
}; 

/** 
* Update a post 
*/ 
exports.update = function(req, res) { 
    var post = req.post; 
    post = _.extend(post, req.body); 
    post.save(function(err) { 
     if (err) { 
      res.jsonp(500,{ error: err.message }); 
     } else { 
      res.jsonp(post); 
     } 
    }); 
}; 

/** 
* Delete a post 
*/ 
exports.destroy = function(req, res) { 
    var post = req.post; 
    post.remove(function(err) { 
     if (err) { 
      res.jsonp(500,{ error: err.message }); 
     } else { 
      res.jsonp(post); 
     } 
    }); 
}; 

/** 
* Show a post by id 
*/ 
exports.show = function(req, res) { 
    res.jsonp(req.post); 
}; 


/** 
* List of public posts 
*/ 
exports.all = function(req, res) { 
    Post.find().sort('-created').exec(function(err, posts) { 
     if (err) { 
      res.jsonp(500,{ error: err.message }); 
     } else { 
      res.jsonp(200,posts); 
     } 
    }); 
}; 

с

/* Post */ 
    var postController = require('../app/controllers/api/post'); 
    app.post('/api/post', postController.create); 
    app.get('/api/post', postController.all); 
    app.put('/api/post/:postId', postController.update); 
    app.del('/api/post/:postId', postController.destroy); 
    app.get('/api/post/:postId', postController.show); 

    /* Post Param */ 
    app.param('postId', postController.post); 

Теперь мне нужен другой маршрут, как API/запись /: пробкового

но Я не знаю, куда обратиться, можете ли вы дать мне подсказку, пожалуйста? Может ли хороший способ справиться с slug вместо id?

как

exports.post = function(req, res, next, slug) { 
    Post.findOne({'slug': slug}, function (err, post) { 
     if (err) { 
      return next(err); 
     } 
     if (!post) { 
      return next(new Error('Failed to load post ' + slug)); 
     } 
     req.post = post; 
     next(); 
    }); 
}; 
+0

Это не сработает. ': postId' и': slug' - это просто имена переменных. Маршрут остается прежним. – Amberlamps

+0

Я имею в виду использование slug вместо id во всем. У меня есть уникальный slug и индекс – Whisher

+0

. Если вам не нужны разные маршруты для ': postId' и': slug', я не знаю, в чем ваша проблема? Просто используйте заданные маршруты для ': slug'. – Amberlamps

ответ

3

Im делает что-то подобное ... вот мой метод ...

var slugQuery = function(slug){ 
    var query = {$or: [{slug: slug}]}; 
    if (slug.match(/^[0-9a-fA-F]{24}$/)) { 
     query.$or.push({_id: slug}); 
    } 
    return query; 
} 

exports.getProfile = function (req, res) { 
    var slug = req.params.slug; // Can be a slug or _id 

    Profile.findOne(slugQuery(slug), function(err, profile){ 
     if(err){ 
      // DB Error 
      res.status(400); 
      res.end(); 
     }else if(!profile){ 
      res.status(404); 
      res.end(); 
     }else{ 
      res.json(profile); 
     } 
    }); 
}; 

ли эта помощь?

+0

Да, а не я хотел избежать такого «грязного кода» и как @Amberlamps предложить [Просто используйте заданные маршруты для: slug then], поэтому я использую slug вместо _id - спасибо за точку – Whisher

+0

@Whisher Im фактически отказывается от подхода I упомянутый выше, как и вы, чувствуете себя слишком грязным. Я также хочу удалить любую несоответствие/путаницу с использованием идентификаторов и пули, поэтому я придумал другое решение здесь: http://stackoverflow.com/questions/14555612/how-to-fetch-a-backbone-js- модель-на-то-другое, чем заместитель ID/21417858 # 21417858 – DigitalJohn

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