【问题标题】:acess function in objected, nested inside another function对象中的访问函数,嵌套在另一个函数中
【发布时间】:2017-12-17 02:17:24
【问题描述】:

我试图管理一个连接实例,使用一个函数来处理空闲连接断开问题,使用 mysql 数据库和 node.js

目前,我有以下代码(咖啡脚本):

mysql = require 'mysql'

handleDisconnect = () ->
  connection = mysql.createConnection
    host: 'localhost'
    user: 'root'
    password: 'passroot'
    database: 'mydb'

  connection.connect (err) ->
    if err
      console.log 'Error connecting to db: ', err
    setTimeout handleDisconnect, 2000

  connection.on 'error', (err) ->
    console.log 'db error', err
    if err.code == 'PROTOCOL_CONNECTION_LOST'
      handleDisconnect()
    else
      throw err

  handleDisconnect.instance = connection

module.exports = handleDisconnect

express = require 'express'
router = express.Router()
connection = require('../database')().instance

bcrypt = require 'bcryptjs'

router.post '/', (req, res) ->
  credential = connection.escape req.body.credential
  password = connection.escape req.body.password
  res.send credential+password

module.exports = router

问题是,当我尝试访问路由时,出现以下错误:

无法读取未定义的属性“转义”

我做错了什么?

【问题讨论】:

  • handleDisconnect.instance = connection改成@instance = connection还能用吗?自从我做任何咖啡脚本以来已经有很多年了
  • 错误依旧
  • return @贴在handleDisconnect的末尾?
  • 都不返回@instance = connection 或@instance = connection work
  • 两者一样,或者只是访问connection而不是打扰实例,like so

标签: javascript node.js function coffeescript nested


【解决方案1】:

我相信您的问题是handleDisconnect 的最后一行正在返回实例,因此您试图从instance 而不是handleDisconnect 获取instance。因此,如果要访问其上的属性,则需要该函数在最后返回自身。

您还希望该函数使用“this”的等效项(coffeescript 中的@),而不是专门引用handleDisconnect

示例代码:

mysql = require 'mysql'

handleDisconnect = () ->
  connection = mysql.createConnection
    host: 'localhost'
    user: 'root'
    password: 'passroot'
    database: 'mydb'

  connection.connect (err) ->
    if err
      console.log 'Error connecting to db: ', err
    setTimeout handleDisconnect, 2000

  connection.on 'error', (err) ->
    console.log 'db error', err
    if err.code == 'PROTOCOL_CONNECTION_LOST'
      handleDisconnect()
    else
      throw err

  @instance = connection
  @

module.exports = handleDisconnect

虽然我个人只是做以下事情,但根本不用担心“实例”:

  1. 在你的函数中使用@connection
  2. 报废@instance = connection
  3. 让函数返回自身
  4. 使用require('../database')().connection 访问它。

【讨论】:

  • 干杯!像魅力一样工作!
  • 啊,我曾经是这样一个咖啡脚本迷。但是这样的事情让我想起了为什么特征,比如隐含的返回语句,可以是一个真正的 PITA。很高兴它解决了您的问题
  • 我想念箭头函数和文字模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-30
相关资源
最近更新 更多