【问题标题】:regarding foodme project in github关于 github 中的 foodme 项目
【发布时间】:2013-08-02 22:33:22
【问题描述】:

您好,我对 github 上的 foodme express 示例有疑问:

代码:

var express = require('express');
var fs = require('fs');
var open = require('open');

var RestaurantRecord = require('./model').Restaurant;
var MemoryStorage = require('./storage').Memory;

var API_URL = '/api/restaurant';
var API_URL_ID = API_URL + '/:id';
var API_URL_ORDER = '/api/order';

var removeMenuItems = function(restaurant) {
  var clone = {};

  Object.getOwnPropertyNames(restaurant).forEach(function(key) {
    if (key !== 'menuItems') {
      clone[key] = restaurant[key];
    }
  });

  return clone;
};


exports.start = function(PORT, STATIC_DIR, DATA_FILE, TEST_DIR) {
  var app = express();
  var storage = new MemoryStorage();

  // log requests
  app.use(express.logger('dev'));

  // serve static files for demo client
  app.use(express.static(STATIC_DIR));

  // parse body into req.body
  app.use(express.bodyParser());


  // API
  app.get(API_URL, function(req, res, next) {
    res.send(200, storage.getAll().map(removeMenuItems));
  });

我不明白 api 文件夹在哪里。它不存在,我不明白信息是如何从那里进出的。我找不到它。

谁能给我解释一下?

另一个问题: 餐厅有资源

foodMeApp.factory('Restaurant', function($resource) {
  return $resource('/api/restaurant/:id', {id: '@id'});

});

在餐厅控制器中有一个查询:

  var allRestaurants = Restaurant.query(filterAndSortRestaurants);

以及以下几行:

  $scope.$watch('filter', filterAndSortRestaurants, true);

  function filterAndSortRestaurants() {
    $scope.restaurants = [];

    // filter
    angular.forEach(allRestaurants, function(item, key) {
      if (filter.price && filter.price !== item.price) {
        return;
      }

      if (filter.rating && filter.rating !== item.rating) {
        return;
      }

      if (filter.cuisine.length && filter.cuisine.indexOf(item.cuisine) === -1) {
        return;
      }

      $scope.restaurants.push(item);
    });


    // sort
    $scope.restaurants.sort(function(a, b) {
      if (a[filter.sortBy] > b[filter.sortBy]) {
        return filter.sortAsc ? 1 : -1;
      }

      if (a[filter.sortBy] < b[filter.sortBy]) {
        return filter.sortAsc ? -1 : 1;
      }

      return 0;
    });
  };

我不清楚的是: 我们如何只为查询提供一个功能而不激活它。 据我了解,我们应该通过如下查询:

{id: $routeParams.restaurantId}

但我们只传递了对函数的引用。这没有任何意义。

有人能详细说明一下吗?

再次感谢。

【问题讨论】:

  • Express 在其路由中使用:id 语法。路由/api/restaurant/:id 将匹配GET http://domain.com/api/restaurant/19f9ajdsfnlaf 等。req.params.id 将等于19f9ajdsfnlaf,同时正在执行此请求的处理函数。您可以有多个标识符并将它们命名为 id 以外的名称。
  • 如果你想传递一个查询字符串,你可以创建一个新路由/api/restaurant,用GET http://domain.com/api/restaurant/?idName=19f9ajdsfnlaf调用它,并在你的路由函数中以var foo = req.query['idName']'访问它。
  • 实际上,仔细阅读后,我的 cmets 可能无法回答您的问题。我不熟悉 angular.js,所以我不知道调用 return $resource('/api/restaurant/:id', {id: '@id'}); 时会发生什么。我最好的猜测是,当有人对代表该餐厅 ID 的 Express 路由进行 API 调用时,Angular 正在设置自己的函数来执行。

标签: node.js angularjs express


【解决方案1】:
var API_URL = '/api/restaurant';
var API_URL_ID = API_URL + '/:id';
var API_URL_ORDER = '/api/order';

这些行只是定义了插入到 Express 中的字符串常量。它们不是文件夹。

app.get(API_URL, function(req, res, next) {
  res.send(200, storage.getAll().map(removeMenuItems));
});

所以这个对app.get(API_URL...的函数调用告诉Express“注意指向URL(your app's domain)/api/restaurant的GET请求,并执行这个函数来处理这样的请求。”

【讨论】:

  • 非常感谢让事情变得更清楚,但如果你也可以帮助我,我添加了另一个问题:)
【解决方案2】:

“api”不是文件夹。

每个请求都会通过app.get 方法。

此方法将响应 API_URL 变量中定义的路由 /api/restaurant

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多