对象未定义但是console.log显示了一个Object

时间:2017-12-14 06:30:51

标签: javascript node.js sequelize.js

这太奇怪了。它记录了一个db对象,但db.media.update似乎永远不会返回,我无法在任何地方放置调试点,当我在该行上放置调试点时,db显示未定义

这是一个显示问题https://youtu.be/JXyuUbscPLQ

的截屏视频

index.js

import fs from 'fs'
import path from 'path'

import Sequelize from 'sequelize'

import AppConfig from './../../config'

const basename = path.basename(__filename)
const env = process.env.NODE_ENV || 'develop'
const config = AppConfig.get('/db')
const db = {}
let sequelize

if (config.use_env_variable) {
  sequelize = new Sequelize(
    process.env[config.use_env_variable],
    config
  )
} else {
  sequelize = new Sequelize(
    config.database,
    config.username,
    config.password,
    config
  )
}

fs
  .readdirSync(__dirname)
  .filter(file => (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'))
  .forEach((file) => {
    const model = sequelize.import(path.join(__dirname, file))
    db[model.name] = model
  })

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db)
  }
})

db.sequelize = sequelize
db.Sequelize = Sequelize
db.env = env

export default db

mediaGateway.js

import db from './../../db/models/index'

const mediaGateway = {
  update: async (media) => {
    const updatedMedia = await db.media.update(media, { where: { uuid: media.uuid } })
    return updatedMedia
  }
}

export default mediaGateway

enter image description here

这是控制台日志输出的一个db对象。我知道它是一个db对象,因为我也是console.logged db.media等

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:-1)

事实上你的代码似乎没问题。

让我们在类构造函数中注入db对象时尝试不同的方法:

import db from './../../db/models/index'

class MediaGateway 
{
  constructor (db) {
    this._db = db;
  }

  async update (media) {
    const db = this._db;
    return await db.media.update(media, { where: { uuid: media.uuid } });
  }
}

export default new MediaGateway(db);

如果没有帮助,那么在导出之前尝试调试模块内的db对象:

console.log('Before exporting:', db, db.media);
export default db;

如果显示ok,但仍然无法在另一个文件中获取db对象,请尝试使用旧的plain:

module.exports = db;

const db = require('./../../db/models');

我个人仍然没有使用ES6导出/导入,async / await功能,直到它成熟为止。我仍然使用承诺和老派的出口方式和要求模块。