【问题标题】:Node.JS controller not called未调用 Node.JS 控制器
【发布时间】:2014-03-27 10:11:38
【问题描述】:

我的 MEAN 堆栈应用程序有问题。我是 node、angular、mongoDB、express、jade 的新手……这可以解释我失败的原因……

我没有找到一个符合我所有要求的教程,所以我根据不同的教程构建了这个应用程序,但它们从不使用相同的方式来访问/组织数据。有时他们声明服务,有时他们使用路由提供者......

以下是我设置应用程序的方式:

   app.js
   package.json
   routes.js

---config
       auth.js
       database.js
       passport.js

---node_modules
[...]
---public
   +---images
   +---javascripts
   |   |   CarListController.js
   |   |   
   |   \---vendor
   \---stylesheets
           style.css

---views
       index.jade
       layout.jade
       login.jade
       profile.jade

问题出在我的 index.jade 中。在这里,我想显示汽车列表(然后在该列表上进行搜索)。

所以我创建了一个控制器(CarListController.js):

function CarListController($scope, $http) {
    console.log('Calling CarListController'));
    $http.get('/api/cars').success(function(data) {
          $scope.cars = data.cars;
        });
    });

在我的 routes.js 中,我在 json 中检索汽车列表:

module.exports = function(app, passport) {

app.get('/api/cars', function(req, res) {
// load the things we need
var mongoose = require('mongoose');

// define the schema for our user model
var carSchema = mongoose.Schema({
    marque        : String,
    modele        : String,
    desc          : String
 });

// create the model for users and expose it to our app
var Car = module.exports = mongoose.model('Car', carSchema);

    // use mongoose to get all cars in the database
        Car.find(function(err, car) {
    console.dir(car);
            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (err)
                res.send(err)

            res.json(car); // return all cars in JSON format
        });
    });
app.get('/', function(req, res) {       
    res.render('index.jade') // load the index.jade file
});

最后在我的 index.jade 中:

html(lang='fr', ng-app='LocatyvModule')
head
 meta(charset='utf-8')
 title My AngularJS App
 link(rel='stylesheet', href='/stylesheets/style.css')
 script(type='text/javascript', src='/javascripts/vendor/angular/angular.js')
 script(type='text/javascript', src='/javascripts/vendor/angular-bootstrap/ui-bootstrap-tpls.js')
 script(type='text/javascript', src='/javascripts/LocatyvModule.js')
 script(type='text/javascript', src='/javascripts/CarListController.js')
body
 div.container(ng-controller="CarListController")
  div
   div.row.car(ng-repeat="car in cars")
     p A CAR!

当我调用“localhost:8080/api/cars”时 -> 没关系,我的数据库中有 3 辆汽车。

当我调用我的 index.jade 时,我没有得到 3 行,也没有在控制器中得到跟踪。 我做错了什么?

另外我觉得我的项目组织不是很好(如果你有一些建议可以说)。

【问题讨论】:

  • 您确定结果是$scope.cars = data.cars; 而不是$scope.cars = data;。你的项目布局很好。
  • 不能正常工作,但问题是我没有看到我放在控制器中的跟踪日志,所以它甚至没有被调用。
  • 我需要在某处声明我的控制器吗?有时候看到教程里有服务,有必要吗?
  • 您是否在index.jade 中包含了所有必要的 JavaScript?我的意思是angular.js 和你的CarListController.js。在您的index.jade 中,您是否检查了ng-app 的内容是否已添加,相关的 JavsScript 代码是否包含在此页面中。我个人不同意您构建系统的方式。您正在将服务器端 mvc(express jade)与客户端 mvc(角度)混合。你最好选择其中之一,玉或棱角,但不能两者兼而有之。
  • @ShaunXu - OP 不是(无论如何在这个例子中)在(跨,也许?)服务器和客户端之间混合 MVC,而是简单地使用 Jade 作为编写 HTML 的更简洁的替代方案 - 没有模型在上面的玉中使用。然而,就你的观点而言,我同意最好避免将两者混合,因为它(很可能)是不必要的并发症。我可以想象在某些情况下,如果非常刻意地接近,这样做可能是合理的,但它们将是非典型的。也同意查看包含的客户端脚本会很有帮助,缺少一个可能是问题所在。

标签: node.js angularjs express mean-stack


【解决方案1】:

我认为问题在于您没有角度模块并且您的控制器没有注册。您可以在控制器 JavaScript 中尝试以下代码。

var app = angular.module('LocatyvModule', []); app.controllers.controller('CarListController', function ($scope, $http) { console.log('调用 CarListController')); $http.get('/api/cars').success(function(data) { $scope.cars = 数据.cars; }); }); );

【讨论】:

  • 它正在工作。我想我也会重新组织我的项目,使其更加 MVC,并摆脱玉。交易
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2017-04-07
相关资源
最近更新 更多