2016-06-11 94 views
0

我有一個快遞服務器與Passport本地stategy,passport-local和passport-local-mongoose也installed.I要訪問當前用戶模型爲json讀取和寫入數據到它。我頭疼的是該對象不想在我的視圖中顯示數據。它加載沒有錯誤,我不明白髮生了什麼。請幫幫我!req.user數據不顯示在視圖

這裏是我的快遞配置:

var express = require('express'), 
app = express(), 
morgan = require('morgan'), 
bodyParser = require('body-parser'), 
cookieParser = require('cookie-parser'), 
expressSession = require('express-session'), 
hash = require('bcrypt-nodejs'), 
mongoose = require('mongoose'), 
path = require('path'), 
passport = require('passport'), 
localStrategy = require('passport-local').Strategy, 
port = process.env.PORT || 8080, 
User = require('./app/models/user'), 
routes = require('./app/routes/api'); 

mongoose.connect('mongodb://localhost:27017/dashboard'); 
app.use(express.static(__dirname + '/src')); 
app.use(morgan('dev')); 

app.use(bodyParser.urlencoded({extended: true})); 
app.use(bodyParser.json()); 
app.use(cookieParser()); 
app.use(require('express-session')({ 
secret: 'keyboard kat', 
resave: false, 
saveUninitialized: false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.use(new localStrategy(User.authenticate())); 
passport.serializeUser(User.serializeUser()); 
passport.deserializeUser(User.deserializeUser()); 

app.use(function (req, res, next) { 
res.header('Access-Control-Allow-Origin', '*'); 
res.header('Access-Control-Allow-Methods', 'GET', 'POST'); 
res.header('Access-Control-Allow-Methods', 'X-Requested-With, content-   type, Authorization'); 
next(); 
}); 

app.use('/user', routes); 

app.get('/', function (req, res) { 
res.sendFile(path.join(__dirname + '/src/views', 'index.html')); 
}); 

app.use(function (req, res, next) { 
var err = new Error('not found :('); 
err.status = 404; 
next(err); 
}); 

app.use(function (err, req, res) { 
res.status(err.status || 500); 
res.end(JSON.stringify({ 
    message: err.message, 
    error: {} 
})); 
}); 

app.listen(port); 
console.log('Magic happens on port ' + port); 

,路線,我用它來提取數據:

router.get('/data', function (req, res) { 
res.send(req.user); 
}); 

Сhrome開發工具返回正確的對象:

Dev Tools

有角服務:

angular.module('main') 
.factory('MenuService', function ($http) { 

    function getData() { 
     $http.get('/user/data') 
      .success(function (data) { 
       return data; 
      }); 
    } 

    return { 
     info: getData 
    } 
}); 

控制器:

angular.module('main') 
.controller('menuController', function ($mdSidenav, MenuService) { 
    var vm = this; 

    vm.toggleMenu = function() { 
     $mdSidenav('menu').toggle(); 
    }; 

    vm.info = MenuService.info(); 

}); 

而且finaly的觀點:

<md-toolbar layout="row" ng-controller="menuController as menu"> 
<div class="md-toolbar-tools"> 
    <md-button class="md-icon-button md-primary" ng-click="menu.toggleMenu()" aria-label="open menu"> 
     <md-icon md-svg-icon="../../assets/img/hmg.svg"></md-icon> 
    </md-button> 
    <h1>Dashboard</h1> 
    <span flex></span> 
    <h1>{{menu.info.name}}</h1> 
</div> 
</md-toolbar> 

並沒有任何反應:(無景觀,沒有錯誤,絕對沒有:

Browser

回答

0

您需要退回承諾 當處理異步調用或使用pub-sub模式告訴您的數據到達。

發生了什麼是getData函數被調用,在後臺獲取數據,但它不返回給調用者的調用者。爲什麼?因爲getData裏面沒有任何返回。需要返回的東西。

這是一個解決方案,返回承諾。

更新:對不起,有時我忘了$http返回一個resp對象,它有數據。根據這個更新代碼。 因此,在您的服務:

angular.module('main') 
.factory('MenuService', function ($http) { 

    function getData() { 
     return $http.get('/user/data'); //no preprocessing just returning the result of the http call 
    } 

    return { 
     info: getData 
    } 
}); 

而在你的控制器

angular.module('main') 
.controller('menuController', function ($mdSidenav, MenuService) { 
    var vm = this; 

    vm.toggleMenu = function() { 
     $mdSidenav('menu').toggle(); 
    }; 
    //todo this will be called whenever menuController gets initiated 
    //better to put into user action or run only one time... 
    MenuService.info().then(function(resp){ 
     console.log(resp); //here is the response 
     vm.info = resp.data; 
    }, function(err){ 
     //todo when no data arrived 
    }); 

    return vm; 
}); 

而且.success.error根據docs

的$ HTTP遺留承諾的方法成功和錯誤棄用已棄用。改爲使用標準然後方法。如果$ httpProvider.useLegacyPromiseExtensions設置爲false,那麼這些方法將拋出$ http/legacy錯誤。

+0

謝謝你的回答,@eenagy!我按照你的寫法制作,但仍然沒有任何反應: –

+0

此處導航的結果是什麼http:// localhost:8080/user/data? – eenagy

+0

這裏:[郵遞員](http://i.imgur.com/sqhgtHj .jpg?1)和[瀏覽器](http://i.imgur.com/LwZZ11B.jpg?1) –

0

您可以在異步調用中編寫此語句。

return vm; 

vm不過this object.You不需要從控制器返回。

您的controller as語法自動將this對象綁定到作用域對象。

請刪除它。

讓剩下的聲明保持原樣。

MenuService.info().then(function(resp){ 
     console.log(resp); //here is the response 
     vm.info = resp.data; 
    }, function(err){ 
     //todo when no data arrived 
    });