Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.116.183] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток!
Кто юзал связку Sequlize@5.15.0 и Epilogue@0.7.1? Запускаю Express сервер, делаю запрос get $ curl http://localhost:8081/users {"message":"internal error","errors":["Catch statement predicate: expecting an object but got [object Undefined]"]} сервер выводит ошибку 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 то все пучком! Код сервера 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 { "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" } } |
Сообщ.
#2
,
|
|
|
После длительного поиска глюка я кое-что нашел
Там какая то трабла с Bluebird какая хз, я заменил на стандартный промис из ES6+ и все зашуршало Ошибка была модуле epilogue\lib\Controllers\base.js именно там я и отключил голубую птицу |
Сообщ.
#3
,
|
|
|
Как оказалось ее уже решил BasitAli
Epilogue: Support sequelize v5 Как я понял в 5ой версии Sequelize ссылка на экземпляр Sequelize не определена через model поэтому возникала ошибка при обращении к model.sequelize в Controller#_control при вызове hookChain.catch в модуле lib/Controller/base.js. BasitAli передал ссылку на Sequelize через параметр при создании контролера и исправил обращение по неверной ссылке Пардон ошибочка На самом деле все дело в ValidationError, ссылка на Sequelize есть в model контролера, но в ней почему то нет функции ValidationError, а вот в ссылке передаваемой непосредствено при создании контроллера она есть |
Сообщ.
#4
,
|
|
|
- Маста, я так и не понял а причем тут голубая птица?
Прости Новичок? - Ну вы выше писали, что решили этот вопрос через замену Bluebird на нативный промис ES6 О! Просто catch обработчики Bluebird поддерживает так называемые фильтры, это типо как в языках C++/Java/C# где срабатывает определенный кэч, в зависимости от типа исключения. Так вот Bluebird проверяет их (фильтры) валидность еще до исполнения. В нашем случае эту проверку не проходил model.sequelize.ValidationError он был undefined, поэтому и возникало исключение. Но если заменить Bluebird на нативный промис, то этой проверки не было, поскольку в нативном передается только коллбэк, что и позволило коду выполнятся без этой ошибки. Но этим действием я убрал обработку ошибок в зависимости от условия. Что могло привести в дальнейшем к возможно другим ошибкам. Я дальше код не тестировал Наш коллега BasitAli исправил ее, правда я еще не понял какого типа ссылка является model.sequelize, вот где строгая типизация помогла бы |
Сообщ.
#5
,
|
|
|
Разобрался в версии Sequelize 5 свойство model.sequelize это экземпляр Sequelize, а в нем не определен ValidationError, он определяется в самом классе Sequelize, поэтому мы передаем его (ссылку на класс Sequelize) в контролер явно через свойство sequelize.
Sequelize 4 сорцы не смотрел, но логично предположить что ValidationError определен в самом классе Model. |