节点:所需文件的名称冲突

时间:2014-07-10 04:12:14

标签: javascript node.js

感谢您阅读!!

问题

如何避免名称冲突?那是我的问题吗?这是正确的用语吗?

详情

我是节点&的新手javascript并编写一个与不同类型的网络设备进行对话(tcp on 23)的应用程序。

我决定为每台设备创建一个单独的js文件,并在require文件中app.js创建它们。

当我启动应用时,apple1会连接,但只要banana1连接,我就会失去与apple1的连接。我没有收到apple1的断开连接消息。

我怀疑存在某种变量名称冲突,因为当我改变最后连接苹果的顺序时,那么香蕉就是我失去连接的那种。为了支持我的怀疑,在banana.js我指定self = this;的位置,我将其更改为somethingElse = this。通过这样做,我能够同时连接到两个设备。

app.js

var deviceA = require('./apple.js');
var apple1 = new deviceA({
  ipAddress: "192.168.1.97",
  port: 23
})
apple1.connect();
apple1.on('connect', function(data) {
  console.log('Apple: Device Connected @' + apple1.ipAddress);
})
apple1.on('disconnect', function(data) {
  console.log('Apple: Device Disconnected');
})

var deviceA = require('./banana.js');
var banana1 = new deviceA({
  ipAddress: "192.168.1.97",
  port: 23
})
banana1.connect();
banana1.on('connect', function(data) {
  console.log('Banana: Device Connected @' + banana1.ipAddress);
})
banana1.on('disconnect', function(data) {
  console.log('Banana: Device Disconnected');
})

apple.js

var events = require('events');

var Apple = function(opts) {
  this.ipAddress = opts.ipAddress;
  this.port = opts.port;
};

Apple.prototype = new events.EventEmitter;
module.exports = Apple;

Apple.prototype.connect = function() {
  self = this;
  // telnet to apple
  var net = require('net');
  self.connection = net.createConnection(self.port, self.ipAddress);
  self.connection.setEncoding("UTF8");

  self.connection.on('connect', function(data) {
    self.emit('connect');
  });
  self.connection.on('disconncect', function(data) {
    self.emit('disconnect');
  });
}

banana.js

var events = require('events');

var Banana = function(opts) {
  this.ipAddress = opts.ipAddress;
  this.port = opts.port;
};

Banana.prototype = new events.EventEmitter;
module.exports = Banana;

Banana.prototype.connect = function() {
  self = this;
  // telnet to banana
  var net = require('net');
  self.connection = net.createConnection(self.port, self.ipAddress);
  self.connection.setEncoding("UTF8");

  self.connection.on('connect', function(data) {
    self.emit('connect');
  });
  self.connection.on('disconncect', function(data) {
    self.emit('disconnect');
  });
}

1 个答案:

答案 0 :(得分:2)

  

如何避免名称冲突?

不要使用(implicit) global变量。

  

这是我的问题吗?

是。你造成了它,你需要修复它。

  

这是正确的用语吗?

是!

  

如何解决?

不要重命名碰撞变量,而是declare it as local using var

  

如何防止这种情况?

对所有文件使用strict mode,并且在分配未声明的全局变量时会遇到异常。