明确存在的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模式,并在添加方法之前编译它。 这个答案不完全正确。