2016-11-14 55 views
1

我是Mean stack的新手,並且一直在爲此奮鬥了好幾天。 給你一個我想要做的事情的想法;我創建了一個標記工具,將所有請求及其標記存儲在名爲標記的集合中,然後將所有不同的標記存儲到標記名集合中。我想了解爲什麼我的MEAN堆棧API層給我一個404錯誤。 這個錯誤只發生在我的put方法在server.js文件中。平均堆棧控制器服務器端未連接到API

TaggingTool \ server.js

var express   = require('express'), 
app    = express(), 
bodyParser  = require('body-parser'), 
mongoose   = require('mongoose'), 
tagsController = require('./server/controllers/tagscontroller'); 

mongoose.connect('mongodb://localhost:27017/STDBank'); 

app.use(bodyParser()); 

app.get('/', function (req, res) { 
res.sendfile(__dirname + '/client/views/index.html'); 
}); 

app.use('/js', express.static(__dirname + '/client/js')); 

//REST API 
app.get('/api/tags', tagsController.list); 
app.get('/api/tagnames', tagsController.listName); 
app.post('/api/tags', tagsController.create); 
app.put('/api/tagUpdate/:id', tagsController.update); 

app.listen(3000, function() { 
console.log('I\'m Listening...'); 
}) 

TaggingTool \服務器\型號\ tag.js

var mongoose  = require('mongoose'); 
var Schema  = mongoose.Schema; 

var TagSchema = new Schema({ 
    request: String, 
    intentTag: String 
}, {collection : "requests"}); 

module.exports = mongoose.model('Tag', TagSchema); 

TaggingTool \服務器\型號\ name.js

var mongoose  = require('mongoose'); 
var Schema  = mongoose.Schema; 

var nameSchema = new Schema({ 
    name: String 
}, {collection : "tags"}); 

module.exports = mongoose.model('TagName', nameSchema); 

TaggingTool \ server \ controllers \ tagscontroller.js

var Tag = require('../models/tag'); 
var TagName = require('../models/name'); 

module.exports.create = function (req, res) { 
    var tag = new Tag(req.body); 
    tag.save(function (err, result) { 
    res.json(result); 
    }); 
} 
module.exports.listName = function(req, res){ 
    TagName.find({}, function(err, results){ 
     res.json(results); 
    }); 
} 
module.exports.list = function (req, res) { 
    Tag.find({}, function (err, results) { 

    /*var arr = []; 
    for(var i = 0; i<results.length;i++){ 
     if(results[i].intentTag){ 
      console.log("enter if: ", results[i].intentTag); 
     }//end of if statement 
     else{ 
      console.log("enter if: ", results[i].intentTag); 
      console.log("enters else statement ", arr); 
      arr.push({ 
      _id : results[i]._id, 
      request : results[i].request 
      }); 
     }//end of else statement 
    }//end of for loop 
    console.log("results ",arr); 
    */ 
    res.json(results); 
    }); 
} 

module.exports.update = function(req, res){ 
    console.log("Server side entered", res); 
    Tag.findByIdAndUpdate(req.params.id, { 
     $set: { 
      request: req.body.request, 
      intentTag: req.body.intentTag 
      } 
     }, function (err, tag){ 
      if(err) res.send(err); 
      res.json(tag); 
    }); 
} 

TaggingTool \客戶\ JS \控制器\ tagsController.js

app.controller('tagsController', ['$scope', '$resource', function ($scope, $resource) { 
var Tag = $resource('/api/tags'); 
var TagName = $resource('/api/tagnames'); 
var tagUpdate = $resource('/api/tagUpdate/:id'); 

    Tag.query(function (results) { 
     $scope.tags = results; 
    }); 

    TagName.query(function(results){ 
     $scope.tagnames = results; 
    }); 

    tagUpdate.query(function(results){ 
     $scope.tags = results; 
     console.log("results: ", results); 
    }); 
    //$scope.tags = []; 
    $scope.newtags=[]; 

    console.log("tagReq", $scope); 

    $scope.newTag = function (index) { 
     console.log("newTag initiated"); 
     var ntag = new tagUpdate(); 
     console.log("_id: ", index); 
     var k = $scope.tagReq.request; 
     console.log("request: ", k); 
     var t = $scope.newTagName.tagname.name; 
     console.log("intentTag: ", t); 
     ntag._id = index; 
     ntag.request = $scope.tagReq.request; 
     ntag.intentTag = $scope.newTagName.tagname.name; 
     console.log("Tags: ", index); 
     $scope.ntag.$update({_id: index}, ntag); 

    } 

    $scope.createTag = function() { 
    var tag = new Tag(); 
    tag.request = $scope.tagReq; 
    tag.intentTag = $scope.tagName; 
    tag.$save(function (result) { 
     $scope.tags.push(result); 
     $scope.tagName = ''; 
    }); 
    } 
}]); 

TaggingTool \客戶\ JS \ app.js

var app = angular.module('taggingApp', ['ngResource']) 

TaggingTool \客戶\視圖\ index.html在

<!DOCTYPE html> 
<html ng-app="taggingApp"> 
    <head> 
     <meta charset="utf-8"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
     <title>Tagging Tool </title> 
     <meta name="description" content=""> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
    </head> 
    <body> 
    <link rel="stylesheet" href="http://mbenford.github.io/ngTagsInput/css/ng-tags-input.min.css" /> 
     <!-- Meetups View --> 
     <div ng-controller="tagsController"> 
     <style type="text/css"> 
     .tg {border-collapse:collapse;border-spacing:0;} 
     .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;} 
     .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;} 
     .tg .tg-yw4l{vertical-align:top} 
    </style> 
    <table class="tg"> 
     <caption><b><strong><em>Requests and their Tags</em></strong></b></caption> 
     <tr ng-repeat="tag in tags "> 
      <th ng-model="tagReq">{{tag.request}}</th> 
      <th> 
       <select ng-model="newTagName" ng-options="tagname.name for tagname in tagnames"> 
         <option value="" >Select Tag</option> 
       </select> 
       <form ng-submit="newTag(tag._id)"> 
         <input type="text" placeholder="Tag Name" ng-model="newTagName.tagname.name"></input> 
         <input type="submit"/> 
       </form> 
       <p>{{newTagName.tagname.name}}</p> 
       <p>{{tagReq.tag.request}}</p> 
      </th> 
     </tr> 
    </table> 
    <form ng-submit="createTag()"> 
     <input type="text" placeholder="Tag name" ng-model="tagName"></input> 
     <button type="submit">Add</button> 
    </form> 
    </div> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular.js"></script> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.16/angular-resource.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular.min.js"> </script> 
     <script src="http://mbenford.github.io/ngTagsInput/js/ng-tags-input.min.js"></script> 
     <script type="text/javascript" src="/js/app.js"></script> 
     <script type="text/javascript" src="/js/controllers/tagsController.js"> </script> 
    </body> 
</html> 

我爲可怕的代碼和編碼約定表示歉意,如果有人能幫助我,我會非常感激。

回答

0

我認爲,只有當您嘗試從您的Angular客戶端進行更新時纔會出現此問題?如果是這樣:默認情況下,Angular的$資源沒有使用PUT方法的更新方法,請參閱here

您需要沿線手動定義此,東西:

$resource('/api/tagUpdate/:id', { id: '@_id' }, { 
    'update': { method: 'PUT' } 
}); 

然後,您可以使用資源的update方法執行更新過程。

附加提示:關於REST約定,我不會調用URL tagUpdate,而是tags或類似的東西。您正在更新的事實已由HTTP方法PUT給出。

+0

非常感謝。這解決了這個問題。我也更新了我的代碼,以便遵循REST約定。謝謝 –