Sequelize 4.42.0: установка метода экземпляра возвращает ошибку «не функция» - PullRequest
0 голосов
/ 28 января 2019

Моя консоль показывает следующую ошибку:

POST /log-in 200 637.310 ms - 42
Unhandled rejection TypeError: models.UserAccount.setJwTokenCookie is not a function
    at models.UserAccount.findOne.then.userRecord (/home/owner/PhpstormProjects/reportingAreaApi/routes/index.js:99:33)
    at tryCatcher (/home/owner/PhpstormProjects/reportingAreaApi/node_modules/bluebird/js/release/util.js:16:23)

Я пытался добавить методы экземпляра в определение модели UserAccount.Метод setJwTokenCookie, кажется, виноват ниже:

'use strict';
require('dotenv').load();
const bcryptjs = require('bcryptjs'),
      jsonWebToken = require('jsonwebtoken'),
      moment = require('moment'); 


module.exports = (sequelize, DataTypes) => {
  const UserAccount = sequelize.define('UserAccount', {
    username: DataTypes.STRING,
    password: DataTypes.STRING
  });

    // cookie-setter
  UserAccount.prototype.setJwTokenCookie = (responseLocal, userId) => {
    // generate a new jwt encoded with userId:
    const signedToken = jsonWebToken.sign({
      data: {
        userId : userId
      }
    }, <secret>); 

    const dateIn10Years = new moment()
      .add(10, "years").toDate();

    responseLocal.cookie('jwTokenCookie', signedToken, {
      httpOnly: true,
      expires : dateIn10Years
    })
  };

  return UserAccount;
};

Я пытаюсь следовать формату метода экземпляра, показанному здесь: http://docs.sequelizejs.com/manual/tutorial/models-definition.html#expansion-of-models

Кто-нибудь знает источник этой ошибки?Я работаю внутри проекта Express.js, и ошибка возникает, когда к соответствующему обработчику маршрута отправляется почтовый запрос.

Этот метод вызывается здесь:

router.post('/log-in', passport.authenticate('local'), (req, res) => {
  // get the user's Id. Then set the cookie with it
  models.UserAccount.findOne({ where : { username : req.body.username }})
    .then(userRecord => {
      const { userId } = userRecord;
      return models.UserAccount.setJwTokenCookie(res, userId);
    });

1 Ответ

0 голосов
/ 06 февраля 2019

Вы определили его как метод экземпляра:

UserAccount.prototype.setJwTokenCookie

Но вызываете его как метод класса:

models.UserAccount.setJwTokenCookie

Это должно быть просто:

.then(userRecord => {
  const { userId } = userRecord;
  return userRecord.setJwTokenCookie(res, userId);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...