明确存在的function被确定为未定义的

我正在尝试在NodeJS和AngularJS中构build一个简单的链接共享Web应用程序。 我有一个函数存在,但被报告为未定义。

以下是angularApp.js中此操作的特定代码

app.factory('auth', ['$http', '$window', function($http, $window){ var auth = {}; auth.register = function(user){ return $http.post('/register', user).success(function(data){ auth.saveToken(data.token); }).error(function(err, req, res, next) {console.log(err)}); }; return auth; }]); 

这里是routes \ index.js中注册路由的代码

 var express = require('express'); var jwt = require('express-jwt'); var router = express.Router(); var auth = jwt({secret: 'SECRET', userProperty: 'payload'}); var mongoose = require('mongoose'); var User = mongoose.model('User'); // Creates a user given a username and password router.post('/register', function(req, res, next){ if(!req.body.username || !req.body.password){ return res.status(400).json({message: 'Please fill out all fields'}); } var user = new User(); user.username = req.body.username; user.setPassword(req.body.password); user.save(function (err){ if(err){ return next(err); } return res.json({token: user.generateJWT()}) }); }); 

Users.js

 var mongoose = require('mongoose'); var jwt = require('jsonwebtoken'); var UserSchema = new mongoose.Schema({ username: {type: String, lowercase: true, unique: true}, hash: String, salt: String }); mongoose.model('User', UserSchema); // Accepts a password then generates a salt and associated password hash UserSchema.methods.setPassword = function(password) { ... }; 

这里是有问题的HTML文件代码:

 <form ng-submit="register()" style="margin-top:30px;"> <input type="text" class="form-control" placeholder="Username" ng-model="user.username"></input> <input type="password" class="form-control" placeholder="Password" ng-model="user.password"></input> <button type="submit" class="btn btn-primary">Register</button> </form> 

因为我有}).error(function(err, req, res, next) {console.log(err)}); 在angularApp.js中,当我单击“注册”button时,在控制台中得到以下输出:

 <h1>undefined is not a function</h1> <h2></h2> <pre>TypeError: undefined is not a function at C:\Linked\linked\routes\index.js:107:8 ... </pre> 

C:\Linked\linked\routes\index.js:107:8是以下行: user.setPassword(req.body.password);

console.log()不会输出route \ index.js中的任何东西,不pipe我放什么(甚至是console.log("hi"); ),所以我无法检查req.body的值。

 app.factory('auth', ['$http', '$window', function($http, $window){ var auth = {}; auth.register = function(user){ return $http.post('/register', user).success(function(data){ auth.saveToken(data.token); }).error(function(err, req, res, next) {console.log(err)}); }; return auth; }]); 

在这一行auth.saveToken(data.token); – auth将引用工厂函数中指定的auth对象,该对象上没有定义saveToken方法。 这是造成范围和closures的问题。 尝试在这里重命名auth到别的东西或者重命名var auth = jwt({secret: 'SECRET', userProperty: 'payload'}); (或者无论你在angular度应用中定义它)

编辑:事实certificate,问题是与mongoose模式,并在添加方法之前编译它。 这个答案不完全正确。