javascript - 函数未定义,Bookshelf.js 模型函数未被识别为函数

标签 javascript node.js express bookshelf.js

我正在使用Bookshelf.js处理用户注册 API 端点,使用 NodeJS 和 ExpressJS 设计。但在发布到注册网址后,我在用户模型函数之一中不断遇到错误。

这是routes/index.js

var User = require(./models/User);
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'});
  }
  try {
      var hash = User.createPassword(req.body.password);
      console.log(hash);
      new User({email: req.body.username, name: req.body.username, password: hash}).save().then(function(model) {
          return res.json({token: this.generateJWT()});
      });
  } catch (ex) {console.log(ex.stack);}
});

这里是 models/Users.js

var jwt = require('jsonwebtoken');
var bcrypt = require('bcrypt');
var bookshelf = require('../config/bookshelf');

var User = bookshelf.Model.extend({
  tableName: 'users',
  constructor: function() {
    bookshelf.Model.apply(this, arguments);
    this.on('saving', function(model, attrs, options) {
      console.log(this.createPassword(model.attributes.password));
    });
  },
  createPassword: function(password) {
    bcrypt.genSalt(10, function (err, salt) {
      if(err) return next(err);
      bcrypt.hash(password, salt, function (err, hash) {
        if(err) return next(err);
        return hash;
      });
    });
  },
  validPassword: function(password, encryptedPass) {
    bcrypt.compare(password, user.encryptedPass, function (err, match) {
      if(err) cb(err);
      return (match) ? true : false;
    });
  },
  generateJWT: function() {
    // set expiration to 60 days
    var today = new Date();
    var exp = new Date(today);
    exp.setDate(today.getDate() + 60);

    return jwt.sign({
      _id: this._id,
      email: this.email,
      exp: parseInt(exp.getTime() / 1000),
    }, 'SECRET');
  }
});

module.exports = User;

当我尝试 POST 注册时,我得到以下堆栈跟踪:

TypeError: undefined is not a function
    at \routes\index.js:185:21
    at Layer.handle [as handle_request] (\node_modules\express\lib\router\layer.js:95:5)
    at next (\node_modules\express\lib\router\route.js:131:13)
    at Route.dispatch (\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (\node_modules\express\lib\router\layer.js:95:5)

...

在堆栈跟踪中,\routes\index.js:185:21 是以下行:var hash = User.createPassword(req.body.password); at createPassword.

那么我在这里做错了什么?为什么无法识别 createPassword 函数?

最佳答案

createPassword() 未定义为静态方法(又名 classProperties),但您这样调用它。尝试这个模型定义。它应该直接在 User 类上将 createPassword() 公开为 static method .

var User = bookshelf.Model.extend({ //instance methods
  tableName: 'users',
  constructor: function() {
    bookshelf.Model.apply(this, arguments);
    // ...
  },
  validPassword: function(password, encryptedPass) {
    // ...
  },
  generateJWT: function() {
    // ...
  }
}, { //static methods
  createPassword: function(password) {
    // ...
  }
});

额外:您需要修复您的 createPassword,因为它是异步的。下面我将其转换为 Promise 返回函数(因为 bookshelf 广泛使用 Promise),并展示了路由处理程序的示例用法

createPassword: function () {
    return new Promise(function (resolve, reject) {
        bcrypt.genSalt(10, function (err, salt) {
            if (err) return reject(err);
            bcrypt.hash(password, salt, function (err, hash) {
                if (err) return reject(err);
                resolve(hash);
            });
        });
    });
}

// in route handler

if (!req.body.username || !req.body.password) {
    return res.status(400).json({
        message: 'Please fill out all fields'
    });
}
try {
    User.createPassword(req.body.password)
    .then(function(hash) {

        console.log(hash);

        return new User({
            email: req.body.username,
            name: req.body.username,
            password: hash
        }).save();

    }).then(function (model) {

        return res.json({
            token: this.generateJWT()
        });

    }).catch(function(ex) {
        console.log(ex.stack);
    });
} catch (ex) {
    console.log(ex.stack);
}

关于javascript - 函数未定义,Bookshelf.js 模型函数未被识别为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706043/

相关文章:

javascript - 为什么 $.fn.find() 中的选择器不能引用超出当前 $ 范围的树?

javascript - highcharts 5.0.14 问题与 textOverflow

javascript - 如何在对象数组上使用 onChange 在 ReactJS 中添加数据

node.js - Object.values 不是函数错误

javascript - node.js 在 Web 开发环境中的位置在哪里?

javascript - MEAN Node JS 在许多请求中请求交互

javascript - OnClick 的蓝色覆盖

node.js - src 之外的文件的符号链接(symbolic link) node_modules

javascript - 调试将全栈应用程序部署到 Heroku

node.js - Express 路由器不调用返回空 obj 的 get 请求