显然存在的功能被识别为未定义

时间:2015-07-07 18:14:35

标签: javascript angularjs node.js express

我正在尝试在NodeJS和AngularJS中构建一个简单的链接共享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>

因为我在angularApp.js中有}).error(function(err, req, res, next) {console.log(err)});,所以当我点击Register按钮时,我在控制台中得到以下输出:

<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()不会在routes \ index.js中输出任何内容,无论我放置什么(偶数console.log("hi");),因此我无法检查req.body的值。< / p>

1 个答案:

答案 0 :(得分:4)

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方法。这导致范围和关闭问题。尝试将auth重命名为其他内容,或者在var auth = jwt({secret: 'SECRET', userProperty: 'payload'});中重命名身份验证(或在角应用中定义它的任何位置)

编辑:事实证明问题在于mongoose架构并在添加方法之前对其进行编译。这个答案并不完全正确。