类undefined

时间:2017-01-23 03:47:43

标签: javascript node.js ecmascript-6 babeljs es6-class

我在构造函数中从类创建一个新对象,并且每当它运行时我得到一个错误,操作在方法中是未定义的,尽管它是在构造函数中定义的。操作本身经过全面测试,在单独的环境中运行良好,因此不是问题所在。我用Babel构建它,直接在Node 7.0.0中运行它

import Operate from "./operate"

export default class {

  constructor(Schema) {
    this.schema = Schema
    this.operate = new Operate(this.schema)
    console.log(this.operate.run) // <- Logs just fine
  }

  update(req, res) {
    console.log(this.operate.run) // <- Nada
    this.operate.run(req.body)
      .then(value => {
        res.status(200).json(value)
      })
  }

enter image description here

这感觉我错过了一些基本的东西。我听说这不是一个很好的模式,所以请随意提出一个更好的方法。非常感谢提前。

更新:这是使用更新的方式。我不怀疑这里有任何问题,因为当我从另一个模块导入控制器作为函数而不是类

时它工作得很好
import {Router, } from "express"
import Controller from "../controller"
import User from "./user.model"

let controller = new Controller(User)
let router = new Router()

router.post("/", controller.update)

module.exports = router

1 个答案:

答案 0 :(得分:2)

从此改变:

router.post("/", controller.update)

到此:

router.post("/", controller.update.bind(controller))

当您传递controller.update时,它只传递了一个指向该方法的指针,并且与controller对象的任何关联都将丢失。然后,当稍后调用update方法时,与适当的对象没有关联,因此方法中的this处理程序是错误的,并且您得到了您看到的错误。

您要么强制绑定对象中的update方法,要么将方法传递给其他可能无法正确调用的方法,您可以使用上述结构传递方法的绑定版本。

您还可以修改update方法的定义,通过将其添加到构造函数中将其永久绑定到构造函数中的对象:

this.update = this.update.bind(this);