На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
  
> Sequelize + Epilogue , Непонятки
    Доброго времени суток!

    Кто юзал связку Sequlize@5.15.0 и Epilogue@0.7.1?
    Запускаю Express сервер, делаю запрос get
    ExpandedWrap disabled
      $ curl http://localhost:8081/users
       
      {"message":"internal error","errors":["Catch statement predicate: expecting an object but got [object Undefined]"]}

    сервер выводит ошибку
    ExpandedWrap disabled
      Unhandled rejection Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
      ...

    Если юзать Sequlize@4.42.0 и Epilogue@0.7.1 то все пучком! :wall:

    Код сервера
    ExpandedWrap disabled
      const express = require('express')
      const Sequelize = require('sequelize')
      const epilogue = require('epilogue')
      const bodyparser = require('body-parser')
       
      const app = express()
      app.use(bodyparser.urlencoded({ extended: true }))
      app.use(bodyparser.json())
       
      const database = new Sequelize({
          dialect: 'sqlite',
          storage: './testdb.sqlite',
      })
       
      const User = database.define('users', {
          username: Sequelize.STRING,
          birthday: Sequelize.DATE,
      })
       
       
      // Initialize epilogue
      epilogue.initialize({ app, sequelize: database })
       
      // Create REST resource
      const userResource = epilogue.resource({
          model: User,
          endpoints: ['/users', '/users/:id'],
      })
       
      // Create database and listen
      database.sync({ force: true }).then(() => {
          app.listen(8081, () => console.log('listening to port localhost:8081'))
      })


    package.json
    ExpandedWrap disabled
      {
        "name": "sequelize-epilogue-sample",
        "version": "1.0.0",
        "main": "server.js",
        "scripts": {
          "start": "node server.js"
        },
        "author": "Cfon",
        "license": "ISC",
        "dependencies": {
          "body-parser": "^1.14.2",
          "epilogue": "^0.7.1",
          "express": "^4.13.3",
          "sequelize": "^5.15.0",
          "sqlite3": "^4.0.9"
        }
      }
    Сообщение отредактировано: Cfon -
      После длительного поиска глюка я кое-что нашел :wall:
      Там какая то трабла с Bluebird какая хз, я заменил на стандартный промис из ES6+ и все зашуршало :D
      Ошибка была модуле epilogue\lib\Controllers\base.js именно там я и отключил голубую птицу :D
        Как оказалось ее уже решил BasitAli :D
        Epilogue: Support sequelize v5
        Как я понял в 5ой версии Sequelize ссылка на экземпляр Sequelize не определена через model поэтому возникала ошибка при обращении к model.sequelize в Controller#_control при вызове hookChain.catch в модуле lib/Controller/base.js.
        BasitAli передал ссылку на Sequelize через параметр при создании контролера и исправил обращение по неверной ссылке :victory:

        Пардон ошибочка :D
        На самом деле все дело в ValidationError, ссылка на Sequelize есть в model контролера, но в ней почему то нет функции ValidationError, а вот в ссылке передаваемой непосредствено при создании контроллера она есть :huh:
        Сообщение отредактировано: Cfon -
          - Маста, я так и не понял а причем тут голубая птица? :huh:

          Прости Новичок?

          - Ну вы выше писали, что решили этот вопрос через замену Bluebird на нативный промис ES6

          О! Просто catch обработчики Bluebird поддерживает так называемые фильтры, это типо как в языках C++/Java/C# где срабатывает определенный кэч, в зависимости от типа исключения. Так вот Bluebird проверяет их (фильтры) валидность еще до исполнения. В нашем случае эту проверку не проходил model.sequelize.ValidationError он был undefined, поэтому и возникало исключение. Но если заменить Bluebird на нативный промис, то этой проверки не было, поскольку в нативном передается только коллбэк, что и позволило коду выполнятся без этой ошибки. Но этим действием я убрал обработку ошибок в зависимости от условия. Что могло привести в дальнейшем к возможно другим ошибкам. Я дальше код не тестировал :D
          Наш коллега BasitAli исправил ее, правда я еще не понял какого типа ссылка является model.sequelize, вот где строгая типизация помогла бы :D
          Сообщение отредактировано: Cfon -
            Разобрался в версии Sequelize 5 свойство model.sequelize это экземпляр Sequelize, а в нем не определен ValidationError, он определяется в самом классе Sequelize, поэтому мы передаем его (ссылку на класс Sequelize) в контролер явно через свойство sequelize.
            Sequelize 4 сорцы не смотрел, но логично предположить что ValidationError определен в самом классе Model.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0225 ]   [ 15 queries used ]   [ Generated: 29.03.24, 13:24 GMT ]