0

関数に渡されたオブジェクトがあり、これらの値で DB エントリを保存したいと考えています。

実用的には...

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();
} 

これは絶対にひどいコードです。繰り返しなしで、それを書くより良い方法は何ですか?

4

2 に答える 2

10

私はあなたのコードを理解していません。値が設定されていない場合は、空の文字列に設定します''か?

デフォルトが必要な場合、最も簡単な方法は、スキーマで定義することです。

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

ドキュメントから

于 2012-08-29T08:45:43.747 に答える
1

このようなものはもう少しエレガントかもしれません:

デフォルト値を含む辞書を作成する

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

console.log(defaults)

与えられた値

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

console.log(values)

指定されたデフォルトのエントリが値に含まれていない場合は、値にデフォルト値を追加します

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

console.log(values)
于 2012-08-29T05:32:55.823 に答える