【问题标题】:Dynamic URL queries with AngularJS and NodeJS, MongoDB使用 AngularJS 和 NodeJS、MongoDB 进行动态 URL 查询
【发布时间】:2015-08-28 13:02:34
【问题描述】:

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

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

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: angularjs node.js mongodb query-string


    【解决方案1】:

    您可以为此使用 $location 服务。

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

    【讨论】:

      【解决方案2】:

      您可以使用$resource 轻松地将您的端点映射到您的服务。您应该将您的参数映射到您的 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;
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多