【问题标题】:Object is undefined Yet console.log Shows an Object对象未定义但 console.log 显示一个对象
【发布时间】:2018-05-28 04:16:40
【问题描述】:

这太奇怪了。它记录了一个 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

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

【问题讨论】:

  • update(values: Object, options: Object): Promise<Array<affectedCount, affectedRows>> promise 不返回更新的媒体,它返回数组。
  • 问题不在于返回的内容,问题在于 db 未定义!但是它控制台.logs 为 db 的对象!而且...它似乎没有返回并点击下一个console.log...并且没有报告任何错误
  • 你能声明./../../db/models/index'的内容吗?
  • 确保更新以包括现在
  • 还添加了一个截屏网址

标签: javascript node.js sequelize.js


【解决方案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;

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

module.exports = db;

和

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

我个人仍然没有使用 ES6 的导出/导入、异步/等待功能,直到它成熟为止。我仍然使用 promises 和老式的方式来导出和请求模块。

【讨论】:

  • 同样的行为....运气不好。如果你还没有观看我的截屏视频,我在上面放了一个链接。 console.log 记录一个 db 对象只是毫无意义,但我的 IDE 显示它在调用期间未定义,但它正在命中 sequelize,但它是一个黑洞,我不知道 sequelize 在它出现时发生了什么有我的 where 子句
  • 检查我更新的答案,在导出和启动代码之前尝试执行 console.log,查看是否存在在加载或初始化 db 对象之前调用它的竞争条件
  • 我也做过,index.js里面的console.log返回一个有效的db对象
  • @PositiveGuy 你可以在模块内部和另一个文件中执行module.exports = db;:const db = require('./../../db/models'); 吗?
  • 实际上我不知道,因为理想情况下你的代码应该可以工作,但实际上它表明它不是。
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多