【问题标题】:TypeScript NodeJS TypeError: Cannot read property 'address' of undefinedTypeScript NodeJS TypeError:无法读取未定义的属性“地址”
【发布时间】:2018-02-12 09:14:08
【问题描述】:

我是 TS 新手,所以我不知道为什么会吐出那个错误

VanillaJS 版本运行良好。 将其转移到 TypeScript。 错误在我的 index.ts 中。 使用 tsc 命令编译 TS 代码还是一样的。 如果我在constructor() 中使用console.log(this.server) 正常输出对象 但是当我在 theListening() 上使用 console.log(this.server) 时,它说 undefined 它很奇怪。

app.ts 文件

import * as express from 'express'
import * as http from 'http'
import * as bodyParser from 'body-parser'
import * as cookieParser from 'cookie-parser'
import * as path from 'path'
import indexRoutes from './routes/index'
import userRoutes from './routes/users'

class App {

  public express

  constructor () {
    this.express = express()
    this.middleware()
    this.mountRoutes()
    this.errorHandler()
  }

  private middleware(): void {
    this.express.use(bodyParser.json())
    this.express.use(bodyParser.urlencoded({ extended: false }))

    this.express.use(cookieParser())
    this.express.use(express.static(path.join(__dirname, 'public')))
  }

  private mountRoutes(): void {
    this.express.use('/', indexRoutes)
    this.express.use('/users', userRoutes)
  }

  private errorHandler(): void {
    this.express.use((req, res, next) => {
      let err:any = new Error('Not Found') // I don't know why the err var needs the :any type to work with err.status below it. Without the :any type err.status is spitting errors hahaha
      err.status = 404
      next(err)
    });

    this.express.use((err, req, res, next) => {
      res.locals.message = err.message
      res.locals.error = req.app.get('env') === 'development' ? err : {}

      res.status(err.status || 500)
      res.json({
        message: 'Error'
      })
    })
  }
}

export default new App().express

index.ts 文件

import app from './app'
import * as debug from 'debug'
import * as http from 'http'

class Server {

 public server

 public port

 public debug

constructor () {
  this.debug = debug('myexpress:server')
  this.port = this.normalizePort(process.env.PORT || '3000')
  app.set('port', this.port)
  this.server = http.createServer(app)
  this.server.listen(this.port)
  this.server.on('error', this.onError)
  this.server.on('listening', this.onListening)
}

private normalizePort(val): any {
  let port = parseInt(val, 10)

  if (isNaN(port)) {
    return val
  }

  if (port >= 0) {
    return port
  }

  return false
}

private onError(error): void {
  if (error.syscall !== 'listen') {
    throw error
  }

  let bind = typeof this.port === 'string' ? 'Pipe ' + this.port : 'Port' + 
     this.port

  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges')
      process.exit(1)
      break

    case 'EADDRINUSE':
      console.error(bind + ' is already in use')
      process.exit(1)
      break

    default:
      throw error
  }
}

public onListening(): void {
    let addr = this.server.address() << THIS RIGHT HERE

    let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + 
    addr.port

    debug('Listening on ' + bind)
  }
}

new Server()

【问题讨论】:

  • 您在this 的范围内遇到问题,请查看 Lostfields 答案

标签: node.js typescript express


【解决方案1】:

首先,在使用 .on(监听器)时,将您的方法绑定到正确的范围。

this.server.on('listening', this.onListening.bind(this))

this.server.on('listening', (e) => this.onListening(e))

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 2018-03-13
    • 2017-03-06
    • 2017-11-02
    • 1970-01-01
    • 2022-09-23
    • 2022-11-29
    • 2017-08-30
    • 2017-10-11
    相关资源
    最近更新 更多