使用AngularJS和NodeJS,MongoDB进行动态URL查询

时间:2015-08-28 13:02:35

标签: angularjs node.js mongodb query-string

我真的不明白如何处理附加了查询的网址。

我有接受几个参数的端点,如:

?max_length=50,
?min_length=1,
?active=true,
?only_today=true,
?etc...

通过AngularJS,如果用户检查了这些值,我怎样才能动态设置这些值?

实际上我只是构建一个对象{},当$ scope不为null时附加这些参数。但我认为这不是一个好主意。

NodeJS和MongoDB相同...... 如何根据URL上的查询字符串获取正确的对象?

我在这里做的是分割URL并检查单词等等...我确信有更好的方法,我无法在两个文档中找到它并想​​知道更大的和更大的网址参数开始变得很糟糕。

我知道这是一个真正的低级问题,但我真的不明白如何处理它。

由于

2 个答案:

答案 0 :(得分:0)

您可以使用$ location服务。

https://docs.angularjs.org/api/ng/service/$location

答案 1 :(得分:0)

您可以使用$resource轻松将endPoints映射到您的服务。你应该将你的参数映射到api中的预期值。如果你有条件参数,你需要在后端处理未定义的参数并忽略这些参数。要在nodeJS中映射您的端点,请查看Restify 例如:

angular.module("myApp", []).factory("myFactory", function($resource) {
  var YourResource = $resource('/rest/yourResource');
  var factory = {
    retriveMyResources: function(paramsQuery) {
      return YourResource.query(paramsQuery).$promise;
    }
  };
  return factory;
}).controller("myCtrl", function($scope, myFactory) {
  myFactory.retrieveMyResources({
    maxLength: $scope.maxLength,
    sortBy: $scope.sortBy
  }).then(function(result) {
    $scope.result = result
  })
})

您的节点服务器

//App.js you initialize your server, and include your route files
(function() {
  var restify = require("restify");

  var server = restify.createServer({
    name: "test-server"
  });
  server.pre(restify.CORS());
  server.use(restify.gzipResponse());
  server.use(restify.acceptParser(server.acceptable));
  server.use(restify.queryParser());
  server.use(restify.bodyParser());
  server.use(restify.jsonp());

  require("./routes/your_resource_route.js")(server);

  server.listen("1921", function() {
    console.log('%s listening at %s environment: %s', server.name, server.url, process.env.NODE_ENV);
  });
})();

路由文件示例

module.exports = function(server) {
  var yourResourceService = require("services/your_resource_service.js");

  server.get("rest/yourResource",
    function(req, res, next) {
      return yourResourceService.findResources(req.params.maxLength, req.params.sortBy).then(function(resources) {
        res.send(200, resources);
        next();
      }).catch(function(err) {
        res.send(500, err);
        next();
      }).done();
    }
  );
}

您的服务文件

module.exports = function(app_context) {
  var exampleService = {
    findItems: function(maxLength, sortBy) {
      var sortObject = {};
      sortObject[sortBy || DEFAULT_SORT] = -1;
      return Q(brandMongooseCollection.find({}).sort(sortObject).limit(maxLength || DEFAULT_MAX_LENGTH).lean().exec());
    }
  };
  return exampleService;
};