我使用Chrome打开index.html页面,错误是找不到正确的模块。
Uncaught SyntaxError: Unexpected token < angular.js:1
Uncaught SyntaxError: Unexpected token < controller.js:1
Uncaught SyntaxError: Unexpected token < service.js:1
Uncaught SyntaxError: Unexpected token < main.js:1
我使用 Firefox 并遇到以下类似错误
SyntaxError: expected expression, got '<'
<html ng-app="todo">
angular.js (line 1)
SyntaxError: expected expression, got '<'
<html ng-app="todo">
controller.js (line 1)
SyntaxError: expected expression, got '<'
<html ng-app="todo">
service.js (line 1)
SyntaxError: expected expression, got '<'
<html ng-app="todo">
main.js (line 1)
我一直在寻找我哪里出错了,但仍然没有线索。我将代码复制并粘贴到此处,并提前感谢您指出我。 代码如下所示:
service.js 文件
var service = angular.module("service",[]);
service.factory("todoFactory", ["$http",
function($http){
return {
get: function(){
return $http.get('/todo');
},
create: function(newtodo){
return $http.post('/todo', newtodo);
},
delete: function(id){
return $http.delete('/todo:' + id);
}
}
}]);
controller.js 文件
var ctrl = angular.module("controller", []);
ctrl.controller("mainController", ['$http', '$scope', 'todoFactory', function($scope, $http, todoFactory){
$scope.formData = {};
todoFactory.get().success(function(data){
$scope.todoitems = data;
});
if(!$scope.formData.title && !$scope.formData.content){
//var newtodoData = {
// "title":$scope.formData.title,
// "content" : $scope.formData.content
//}
todoFactory.create($scope.formData)
.success(function(data){
//return the updated todoitems
$scope.todoitems = data;
//clear form data for next time use
$scope.formData = {};
});
}
}]);
main.js 文件
angular.module("todo", ["controller", "service"]);
index.html
<html ng-app="todo">
<head>
<script src="frontend/angular.js"></script>
<script src="frontend/controller.js"></script>
<script src="frontend/service.js"></script>
<script src="frontend/main.js"></script>
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css">
</head>
<body ng-controller="mainController">
<form class="form-inline" ng-submit="submitForm()">
<div class="form-group">
Title:
<input class="form-control col-md-4" type="text" ng-model="formData.title"><br>
</div>
<div class="form-group">
Content:
<input class="form-control col-md-6" type="text" ng-model="formData.content"><br>
</div>
<button class="btn btn-primary" type="submit">Add</button>
</form>
<div>
<p>Here is your todo list:</p>
<div ng-repeat="item in todoitems"></div>
<div class="col-md-3">{{item.title}}</div>
<div class="col-md-6">{{item.content}}</div>
</div>
</body>
</html>
以下是我的服务器端代码
服务器.js
//set up all the modules needed
var express = require("express");
var bodyParser = require("body-parser");
var morgan = require("morgan");
var app = express();
var todoModel = require('./model.js');
//use part for middle layers
app.use(morgan('dev'));
app.use(bodyParser.urlencoded({'extended':'true'}));
app.use(bodyParser.json());
app.use(bodyParser.json({ type: 'application/vnd.api+json' }));
var port = process.env.PORT || 9000;
require('./route.js')(app);
app.listen(port, function() {
console.log("Listening on " + port);
});
后端的Route.js
var todoModel = require('./model.js');
function getAllTodos(res){
todoModel.find(function(err, alltododata){
if(err)
res.send(err);
res.json(alltododata);
});
}
module.exports = function(app){
//render the view page
app.get('*', function(req, res) {
res.sendfile('B:\\node\\ToDo\\NodeTODOMongo\\index.html'); // load the single view file (angular will handle the page changes on the front-end)
});
//get all todos return json data
app.get('/todo', function(req, res){
getAllTodos(res);
});
//create items and send back all todos after creation
app.post('/todo', function(req, res){
todoModel.create({
title : req.body.title,
content: req.body.content
}, function(err, todo){
if(err){
res.send(err);
}
getAllTodos(res);
});
});
app.delete('/todo:id', function(req, res){
todoModel.remove({
_id : req.params.id
}, //what is the alltodo here?
function(err, todo){
if(err)
res.send(err);
getAllTodos(res);
});
});
}
model.js
var mongoose = require('mongoose');
//connect to localhost default test db
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
//let me know if the connection errors out
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
console.log("h");
});
//define schema of the todo model
var schema = new mongoose.Schema({
title: String,
content: String,
createDate: {type: Date, default:Date.now}
});
var model = mongoose.model("todo", schema);
module.exports = mongoose.model("todo", schema);
最佳答案
节点服务器中的 app.get('*', function(req, res) {
行就是这里的问题。基本上,你已经告诉服务器,无论传入什么请求,它应该返回 res.sendfile('B:\\node\\ToDo\\NodeTODOMongo\\index.html');
。这会导致对您的 .js
的请求> 文件导致服务器返回 index.html
而不是实际请求的文件。
您可以在 app.get
之前添加 app.use('/frontend',express.static(__dirname + '/frontend'));
以启用/frontend
目录的静态请求管道,该目录似乎是存储 .js
文件的位置。
正如 @GregL 所指出的,您在 app.get('*',...
之后定义的其他路由也会遇到问题。
我会推荐布兰·福特的blog post关于正确配置 Angular + Express。
关于javascript - AngularJS 中加载模块失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29334507/