Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 特快专递_Node.js_Rest_Express - Fatal编程技术网

Node.js 特快专递

Node.js 特快专递,node.js,rest,express,Node.js,Rest,Express,我有一个rest api: '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(

我有一个rest api:

'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);
        }
    });
};

现在我需要另一条路线,比如 api/post/:slug

但是我不知道该往哪个方向转,你能给我一个提示吗? 使用slug而不是id是一种很好的管理方法吗


我也在做类似的事情。。。这是我的方法

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 );
        }
    });
};

这有用吗?

那不行<代码>:postId和
:slug
只是变量名。路线保持不变。我的意思是使用slug而不是id all。我得到了唯一的slug和INDEXI。如果您不需要为
:postId
:slug
使用不同的路线,我不知道您的问题是什么?只需为
:slug使用给定的路由即可。是的,也不是。我想避免这样一个“混乱的代码”,正如@Amberlamps所建议的[只需为:slug使用给定的路由即可],因此我使用slug而不是_id-感谢您的帮助point@Whisher我实际上放弃了我上面提到的方法,就像你一样,觉得它太乱了。我还想消除ID和SLUG使用中的任何差异/混淆,因此我在这里提出了一个不同的解决方案:
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();
    });
};
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 );
        }
    });
};