2014-11-06 74 views
-1

我一直在使用一些javascript代码时遇到了一些麻烦。我想知道如果stackoverflow可以帮助。将两行nodejs代码合并为一个

我有这个模块...

var errorObject = (function() { 
errorObject = {}; 
errorObject.location = "Unknown"; 
errorObject.schema = mongoose.model('Error', { 
     id: { type: String, index: true }, 
     device: { type: String, index: true }, 
     file: { type: String }, 
     meta: { type: String }, 
     data: { type: String }, 
     type: { type: String } 
    }); 
errorObject.callback = function (err, level, msg, meta) { 
     var data = { 
      device: "test", 
      file: errorObject.location, 
      meta: JSON.stringify(meta), 
      data: msg, 
      type: level 
     }; 
     new errorObject.schema(data).save(function(err, data){ 
     if(!err){ 
      console.log("Saved"); 
     } 
     }); 
    }; 
    return errorObject; 
})(); 

module.exports = {Logger: errorObject} 

对此我试图用像所以我所有的其他节点文件追踪信息...

var Logger = new require('../lib/models').Logger; 
Logger.location = __filename; 

我的问题是,如何我是否将这两条进口线放在一条线上?我必须将日志记录导入到所有的.js文件中,我希望尽可能简洁。

回答

0

在JavaScript中赋值返回赋值它在块之外,这样你就可以做到以下几点:

(x = 5).toString() 
"5" 

所以,你应该能够同样做到

(Logger = new require('../lib/models').Logger).location = __filename; 

[编辑]见下面的评论,我删除了“var”,因为它将变量的范围放在括号中。

+0

这正是我正在寻找的。你必须从行中取出它才能使它起作用。像这样...(Logger = new require('../ lib/models')。Logger).location = __filename; – HarshMarshmallow 2014-11-06 16:00:58

+0

感谢您的跟进,我在回答中修复了代码! – lukevp 2014-11-06 16:33:24

0

你可以把它写这样

(var Logger = new require('../lib/models').Logger).location = __filename; 
1

从你的记录器模块中,导出返回实际记录对象的功能,以及需要时调用这个函数。基本上是这样的:

module.exports = function (location) { 
    return new Logger(location, ...); // Whatever ... 
}; 

然后:

var logger = require('../lib/models/logger')(__filename); 

恕我直言,这甚至比你使用的是现在的语法更加简洁,但它意味着你重写模块的某些部分。 PS:一般来说,你的代码看起来不像node-ish,而是你似乎来自浏览器(就像你使用的是一个IIFE等等)。作为一般建议,您应该阅读更多关于CommonJS模块以及Node的模块系统如何工作的信息。没有必要使用IIFE。

+0

我其实很新的NodeJS。感谢您的建议。我会研究正确的模块格式。 – HarshMarshmallow 2014-11-06 16:09:04

1

你可以只作出适当的构造函数,并传递值到它:

function Logger(location) { 
    if (!(this instanceof Logger)) 
    return new Logger(location); 

    this.location = location || 'Unknown'; 
    this.schema = mongoose.model('Error', { 
    id: { type: String, index: true }, 
    device: { type: String, index: true }, 
    file: { type: String }, 
    meta: { type: String }, 
    data: { type: String }, 
    type: { type: String } 
    }); 
} 
Logger.prototype.callback = function(err, level, msg, meta) { 
    var data = { 
    device: 'test', 
    file: errorObject.location, 
    meta: JSON.stringify(meta), 
    data: msg, 
    type: level 
    }; 
    this.schema(data).save(function(err, data) { 
    if (!err) 
     console.log('Saved'); 
    }); 
}; 

module.exports = { Logger: Logger }; 

然后使用它像:

var Logger = require('../lib/models').Logger(__filename); 

// ... 

Logger.callback(....); 
+0

这实际上应该如何实现。该模式被怪异地导入到回调中,所以我只是在下面简单回答。谢谢您的帮助。 – HarshMarshmallow 2014-11-06 16:03:24