2014-12-26 3 views
1

Мне нужно было использовать пули в URL-адресе вместо идентификатора статьи, поэтому я изменил пару вещей в примере статей, заданном meanjs, но у меня есть проблема, я могу перечислить, просмотреть и но я не могу создавать новые. Я не знаком со стеком MEAN, поэтому очень возможно, что у меня есть что-то очень неправильное в моих модификациях, но я могу подумать, как заставить его работать.Использование слизней в URL-адресе в CRUD в MEANJS

Пуля создается из названия при создании статьи. Я хотел бы также отредактировать, но если бы я также отредактировал поле сляба, функция редактирования перестанет работать и ...

Код относится к ветви 0.4 среднего уровня с использованием вертикальных модулей.

В articles.client.service.js, если я изменю:

angular.module('articles').factory('Articles', ['$resource', 
    function($resource) { 
     return $resource('api/articles/:articleSlug', { 
      articleSlug: '@slug' 
     }, { 
      update: { 
       method: 'PUT' 
      } 
     }); 
    } 
]); 

для:

angular.module('articles').factory('Articles', ['$resource', 
    function($resource) { 
     return $resource('api/articles/:articleSlug', { 
      articleSlug: '@_id' 
     }, { 
      update: { 
       method: 'PUT' 
      } 
     }); 
    } 
]); 

Функция создания начинает работать, но функция редактирования останавливается ... -.-

Любая помощь была бы оценена. Благодаря

Это мой articles.server.routes.js

'use strict'; 

/** 
* Module dependencies. 
*/ 
var articlesPolicy = require('../policies/articles.server.policy'), 
    articles = require('../controllers/articles.server.controller'); 

module.exports = function(app) { 
    // Articles collection routes 
    app.route('/api/articles').all(articlesPolicy.isAllowed) 
     .get(articles.list) 
     .post(articles.create); 

    // Single article routes 
    app.route('/api/articles/:articleSlug').all(articlesPolicy.isAllowed) 
     .get(articles.read) 
     .put(articles.update) 
     .delete(articles.delete); 

    // Finish by binding the article middleware 
    app.param('articleSlug', articles.articleBySlug); 
}; 

Это мой articles.client.service.js

'use strict'; 

//Articles service used for communicating with the articles REST endpoints 
angular.module('articles').factory('Articles', ['$resource', 
    function($resource) { 
     return $resource('api/articles/:articleSlug', { 
      articleSlug: '@slug' 
     }, { 
      update: { 
       method: 'PUT' 
      } 
     }); 
    } 
]); 

Это мой articles.client .controller.js

'use strict'; 

angular.module('articles').controller('ArticlesController', ['$scope', '$stateParams', '$location', 'Authentication', 'Articles', 
    function($scope, $stateParams, $location, Authentication, Articles) { 
     $scope.authentication = Authentication; 

     $scope.create = function() { 
      var article = new Articles({ 
       slug: this.title.toLowerCase().replace(/ /g, '-'), 
       title: this.title, 
       content: this.content 
      }); 
      article.$save(function(response) { 
       $location.path('articles/' + response.slug); 

       $scope.slug = ''; 
       $scope.title = ''; 
       $scope.content = ''; 
      }, function(errorResponse) { 
       $scope.error = errorResponse.data.message; 
      }); 
     }; 

     $scope.remove = function(article) { 
      if (article) { 
       article.$remove(); 

       for (var i in $scope.articles) { 
        if ($scope.articles[i] === article) { 
         $scope.articles.splice(i, 1); 
        } 
       } 
      } else { 
       $scope.article.$remove(function() { 
        $location.path('articles'); 
       }); 
      } 
     }; 

     $scope.update = function() { 
      var article = $scope.article; 

      article.$update(function() { 
       $location.path('articles/' + article.slug); 
      }, function(errorResponse) { 
       $scope.error = errorResponse.data.message; 
      }); 
     }; 

     $scope.find = function() { 
      $scope.articles = Articles.query(); 
     }; 

     $scope.findOne = function() { 
      $scope.article = Articles.get({ 
       articleSlug: $stateParams.articleSlug 
      }); 
     }; 

    } 
]); 

Это мой articles.server.controller.js

'use strict'; 

/** 
* Module dependencies. 
*/ 
var _ = require('lodash'), 
    path = require('path'), 
    mongoose = require('mongoose'), 
    Article = mongoose.model('Article'), 
    errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')); 

/** 
* Create a article 
*/ 
exports.create = function(req, res) { 
    var article = new Article(req.body); 
    article.user = req.user; 

    article.save(function(err) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(article); 
     } 
    }); 
}; 

/** 
* Show the current article 
*/ 
exports.read = function(req, res) { 
    res.json(req.article); 
}; 

/** 
* Update a article 
*/ 
exports.update = function(req, res) { 
    var article = req.article; 

    article.title = req.body.title; 
    article.content = req.body.content; 

    article.save(function(err) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(article); 
     } 
    }); 
}; 

/** 
* Delete an article 
*/ 
exports.delete = function(req, res) { 
    var article = req.article; 

    article.remove(function(err) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(article); 
     } 
    }); 
}; 

/** 
* List of Articles 
*/ 
exports.list = function(req, res) { 
    Article.find().sort('-created').populate('user', 'displayName').exec(function(err, articles) { 
     if (err) { 
      return res.status(400).send({ 
       message: errorHandler.getErrorMessage(err) 
      }); 
     } else { 
      res.json(articles); 
     } 
    }); 
}; 

/** 
* Article middleware 
*/ 

exports.articleBySlug = function(req, res, next, slug) { 
    Article.findOne({'slug': slug}).populate('user', 'displayName').exec(function(err, article) { 
     if (err) return next(err); 
     if (!article) return next(new Error('Failed to load article ' + slug)); 
     req.article = article; 
     next(); 
    }); 
}; 
+0

Что вопрос, что это ошибка или ответ кода вы получите когда вы пытаетесь обновить или создать статью? – teleaziz

+1

Я получаю это на терминальной консоли: «Ошибка: не удалось загрузить статью asdf», которая является сообщением, напечатанным функцией articleBySlug в статьях. Server.controller.js. Полный вывод ошибки здесь: http://pastebin.com/wwxKFi5G – codiaf

ответ

1

Я клонировал 0.4.0 ветки и вот что я сделал, чтобы сделать маршрутизацию по слизняку работает должным образом во всех сценариях.

1- Добавьте пулю в схему статьи и обеспечить его уникальный article.server.model.js

slug: { 
    type: String, 
    default: '', 
    trim: true, 
    unique: true, 
    required: 'Slug cannot be blank' 
} 

2- Re-фактор способа обновления в контроллере статей, чтобы включить Slug:

exports.update = function(req, res) { 
     var article = req.article; 

     article = _.extend(article , req.body); 

     article.save(function(err) { 
      if (err) { 
       return res.status(400).send({ 
        message: errorHandler.getErrorMessage(err) 
       }); 
      } else { 
       res.json(article); 
      } 
     }); 
    }; 

3- Добавьте метод к контроллеру статей, чтобы найти статьи по slug (или вообще что-нибудь в req.запрос)

exports.readBySlug = function(req , res){ 
    Article.findOne(req.query).populate('user', 
    'displayName').exec(function(err, article) { 
    if (err) { 
     return res.status(400).send({ 
      message: errorHandler.getErrorMessage(err) 
     }); 
     } else { 
     res.json(article); 
     } 
    }); 
}; 

3- Затем добавить маршрут, чтобы указать на этот метод (убедитесь, чтобы добавить маршрут в начале маршрута конфигурации или, по крайней мере, до обновления, удаления маршрутов)

app.route('/api/articles/read-slug').get(articlesPolicy.isAllowed , 
    articles.readBySlug); 

4 Изменить политику, чтобы позволить получить к этому маршруту, в articlesPolicy:

exports.invokeRolesPolicies = function() { 
    acl.allow([{ 
     roles: ['admin'], 
     allows: [{ 
      resources: '/api/articles', 
      permissions: '*' 
     }, { 
      resources: '/api/articles/:articleId', 
      permissions: '*' 
     }] 
    }, { 
     roles: ['user'], 
     allows: [{ 
      resources: '/api/articles', 
      permissions: ['get', 'post'] 
     }, { 
      resources: '/api/articles/:articleId', 
      permissions: ['get'] 
     }] 
    }, { 
     roles: ['guest'], 
     allows: [{ 
      resources: '/api/articles', 
      permissions: ['get'] 
     }, { 
      resources: '/api/articles/:articleId', 
      permissions: ['get'] 
     }] 
    }, { 
     roles: ['admin','user','guest'], 
     allows: [{ 
      resources: '/api/articles/read-slug', 
      permissions: ['get'] 
     }] 
    }]); 
}; 

на переднем конце:

1- Изменить маршруты в статьях маршрутов использовать пули вместо ID:

state('articles.view', { 
     url: '/:articleSlug', 
     templateUrl: 'modules/articles/views/view-article.client.view.html' 
    }). 
    state('articles.edit', { 
     url: '/:articleSlug/edit', 
     templateUrl: 'modules/articles/views/edit-article.client.view.html' 
    }); 

2- В взглядах изменить ссылки, чтобы отразить изменения маршрута article.view({articleSlug: article.slug}, то же самое для article.edit

3- Добавить метод обслуживания статей, чтобы получить статьи Slug:

return $resource('api/articles/:articleId/:controller', { 
     articleId: '@_id' 
    }, { 
     update: { 
      method: 'PUT' 
     } , 
     getBySlug: { 
      method: 'GET', 
      params: { 
       controller: 'read-slug' 
      } 
     } 
    }); 

4- Re-фактор метод findOne в контроллере статей, чтобы использовать метод, который мы только что определили (в статьи об эс контроллер):

$scope.findOne = function() { 
     $scope.article = Articles.getBySlug({ 
      slug: $stateParams.articleSlug 
     }); 

5- Наконец повторно фактор обновления и создать для включения слизняка (в контроллере статей):

$scope.update = function() { 
     var article = $scope.article; 
     article.slug = article.title.toLowerCase().replace(/ /g, '-'); 
     console.log(article); 
     article.$update(function() { 
      $location.path('articles/' + article.slug); 
     }, function(errorResponse) { 
      $scope.error = errorResponse.data.message; 
     }); 
    }; 


    $scope.create = function() { 
     var article = new Articles({ 
      slug: this.title.toLowerCase().replace(/ /g, '-'), 
      title: this.title, 
      content: this.content 
     }); 
     article.$save(function(response) { 
      $location.path('articles/' + response.slug); 

      $scope.title = ''; 
      $scope.content = ''; 
     }, function(errorResponse) { 
      $scope.error = errorResponse.data.message; 
     }); 
    }; 
+0

Да, это уже есть. Если я изменю переменную articleSlug в статьях.client.service.js, то я могу создать без проблем, но функции редактирования и удаления перестанут работать. – codiaf

+0

. Создание статьи должно работать в любом случае, поскольку оно не зависит от параметра articleSlug. Я бы сохранил 'articleSlug: @ slug' в файле службы и исследовал проблему на сервере. – teleaziz

+0

это должно работать – teleaziz