2012-08-29 33 views
0

我有一个对象传递给一个函数,并且想用这些值保存一个数据库条目,并且有一些默认选项。在Mongoose /节点中保存一个对象(使用默认值)

在实际应用中......

我有这样一个架构在猫鼬:

var Log = new Schema({ 
    workspaceId : { type: String, index: true }, 
    workspaceName : { type: String, index: true }, 
    loginSession : { type: String, index: true }, 
    loginToken  : { type: String, index: true }, 
    logLevel  : { type: Number, enum:[0,1] }, 
    errorName  : { type: String, index: true }, 
    message  : { type: String, index: true }, 
    reqInfo  : { type: String }, 
    data   : { type: String }, 
    loggedOn  : { type: Date, index: true }, 
}); 
mongoose.model('Log', Log); 

写的东西放在这张桌子上,我有这样的:

exports.Logger = function(logEntry){ 
    var Log = mongoose.model("Log"), 
     req = logEntry.req; 

    log = new Log(); 

    // Sorts out log.reqInfo 
    if (logEntry.req){ 
    log.reqInfo = JSON.stringify({ 
     info : req.info, 
     headers: req.headers, 
     method : req.method, 
     body :req.body, 
     route :req.route, 
     params: req.params  
    }); 
    } else { 
    logEntry.reqInfo = {}; 
    } 

    // Sorts out all of the other fields with sane defaults. 
    // FIXME: improve this code, it's grown into something ugly and repetitive 
    log.workspaceId = logEntry.workspaceId ? logEntryworkspaceId. : ''; 
    log.workspaceName = logEntry.workspaceName ? logEntry.workspaceName : ''; 
    log.loginSession = logEntry.loginSession ? logEntry.loginSession : ''; 
    log.loginToken = logEntry.loginToken ? logEntry.loginToken : ''; 
    log.logLevel = logEntry.logLevel ? logEntry.logLevel : 0; 
    log.errorName = logEntry.errorName ? logEntry.errorName : ''; 
    log.message = logEntry.message ? logEntry.message : ''; 
    log.data = logEntry.data ? logEntry.data : {}; 

    // Sorts out log.loggedOn 
    log.loggedOn = new Date(); 
    log.save(); 
} 

这是绝对可怕的代码。什么是更好的写作方式,没有重复?

+0

询问了猫鼬的解决方案,得到猫鼬的答复,不接受为正确:( –

+0

问来提高代码,猫鼬只有thereason为什么我想改善它,如果我想知道如何在Mongoose中进行默认设置我会得到一个不同的标题,我询问了有关改进此代码的信息,而不是为了不必改进它。 – Merc

+0

您的问题应该是“如何在JavaScript中合并对象”。 –

回答

1

像这样的东西可能会多一点优雅:

创建一个包含给定某个值

values = { 
    workspaceName: 'WNAME1', 
    loginSession: 'LS1', 
    somethingElse: 'qux' 
}; 

console.log(values) 

默认值

defaults = { 
    workspaceName: 'foo', 
    loginSession: 'bar', 
    loginToken: 'baz' 
}; 

console.log(defaults) 

字典如果值中不包含的条目对于任何指定的默认值,将默认值添加到值

for(i in defaults){ 
    if(!values[i]){ 
    values[i] = defaults[i]; 
    } 
} 

console.log(values) 
+0

我只是希望Node有一些准备好去...但显然不是!谢谢,接受回答。 – Merc

+1

在jQuery中有一个扩展方法,mak合并对象更容易。这有几个节点端口(我没有使用过)。例如。 https://github.com/dreamerslab/node.extend。 Tilman关于在模式中使用默认值的答案可能对于猫鼬特定的解决方案更好。 – wdavo

+0

Underscore的_.extend()就是我用来做这个的。 – grantwparks

10

我不明白你的代码。所以,如果一个值没有设置,你希望它被设置为空字符串''

如果您想要使用默认值,最简单的方法就是在模式中定义它们。

var Log = new Schema({ 
    workspaceId : { type: String, index: true, default: 'your default here' }, 
    //... 
    loggedOn  : { type: Date, index: true, default: Date.now } 
}); 

docs

相关问题