node.js - 调用 activator.init 后,Sequelize 急切加载会引发错误

标签 node.js sequelize.js

调用 activator.init 后,急切加载将失败并出现错误“TypeError: Cannot read property 'name' of undefined”

经过大量挖掘,我发现问题来自“集合”模块,该模块嵌套在依赖树的深处。
当调用 activator.init 时,它会导入“styliner”,后者会导入“q-io”,后者会导入“collections”。
问题来自 collections/shim,它在全局范围内定义了 Array。这以某种方式破坏了 Sequelize 急切加载。

我需要在我的项目中同时使用 sequelize eager loading 和 activator。我该如何解决这个问题?

const config = require('./config/config')
const Sequelize = require('sequelize');
const activator = require('activator')

const sequelize = new Sequelize(config.pgsql.database, config.pgsql.user, config.pgsql.password, {
  host: config.pgsql.host,
  dialect: 'postgres',
  operatorsAliases: false,
  // disable logging; default: console.log
  logging: false,
})

const User = sequelize.define('user', {
  name: Sequelize.STRING
})

const Network = sequelize.define('network', {
  name: Sequelize.STRING
})

User.belongsToMany(Network, { through: 'user_networks' })
Network.belongsToMany(User, { through: 'user_networks' })

sequelize.sync({force: true})
.then(() => User.create({
  name: 'janedoe',
}))
.then(jane => jane.createNetwork({name: 'social'}))
.then(() => console.log('BEFORE activator.init()'))

//eager loading is fine before activator.init is called
.then(() => User.findAll({include: [Network]}))
.then(users => users.forEach(user => console.log(user.toJSON())))
.then(() => {
  activator.init({
    user: {
      find: (id, callback) => {},
      activate: (id, callback) => {},
      setPassword: (id,password,callback) => {}
    },
    transport: null,
    templates: activator.templates.file('./'),
    from: 'admin@mttr.net',
    signkey: '',
    id: 'id'
  })
})
.then(() => console.log('AFTER activator.init()'))

//eager loading breaks after activator.init is called
.then(() => User.findAll({include: [Network]}))
.then(users => users.forEach(user => console.log(user.toJSON())))
.catch(err => console.log(err))

控制台输出是

BEFORE activator.init()
{ id: 1,
name: 'janedoe',
created_at: 2018-01-05T17:31:39.106Z,
updated_at: 2018-01-05T17:31:39.106Z,
deleted_at: null,
version: 0,
networks:
[ { id: 1,
name: 'social',
created_at: 2018-01-05T17:31:39.118Z,
updated_at: 2018-01-05T17:31:39.118Z,
deleted_at: null,
version: 0,
user_networks: [Object] } ] }
AFTER activator.init()
TypeError: Cannot read property 'name' of undefined
at Function._validateIncludedElement (/Users/derekxm/git/mttr/app_backend/node_modules/sequelize/lib/model.js:534:41)
at options.include.options.include.map.include (/Users/derekxm/git/mttr/app_backend/node_modules/sequelize/lib/model.js:394:37)
at Array.map (native)
at Function._validateIncludedElements (/Users/derekxm/git/mttr/app_backend/node_modules/sequelize/lib/model.js:390:39)
at Promise.try.then.then (/Users/derekxm/git/mttr/app_backend/node_modules/sequelize/lib/model.js:1537:14)
at tryCatcher (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/promise.js:510:31)
at Promise._settlePromise (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/promise.js:567:18)
at Promise._settlePromise0 (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/promise.js:612:10)
at Promise._settlePromises (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/promise.js:691:18)
at Async._drainQueue (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/async.js:143:10)
at Immediate.Async.drainQueues (/Users/derekxm/git/mttr/app_backend/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:649:20)
at tryOnImmediate (timers.js:622:5)
at processImmediate [as _immediateCallback] (timers.js:594:5)

最佳答案

collections/shim 非常具有侵入性,如果必须同时使用 sequelize eager loading 和 activator,你应该 fork activator并编辑源以删除 Styliner。

删除 lib/mailcomposer.js 中的 Styliner = require('styliner')
从你的 fork 仓库安装激活器。这解决了急切的加载问题,但由于您删除了 styliner,您将无法为您的电子邮件模板加载 css。

关于node.js - 调用 activator.init 后,Sequelize 急切加载会引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48118935/

相关文章:

node.js - 根据项目自动切换到正确的Node版本

javascript - 初学者在这里。我需要帮助更好地理解这个回调函数

node.js - Sequelize,检查行是否存在并返回 bool 值

node.js - Sequelize - 为我的模型实现垃圾

javascript - 在 Centos 5.5 上安装 Node.JS

node.js - 在 Elastic Beanstalk 上安装 mongodb 的推荐方法

sequelize.js - 我如何获得 Sequelize 模型的主键?

sequelize.js - Sequelize 在 JS 中使用驼峰式大小写,但在表名中使用下划线

sequelize.js - 无法捕获此错误 "Unhandled rejection SequelizeForeignKeyConstraintError"

javascript - node.js 中的 Snake_case 或 camelCase