mongoose文件将数字/字符串作为日期处理

时间:2017-11-05 22:24:42

标签: javascript node.js date express mongoose

型号

const hoursSchema = new Schema({
    date: {
        type: Date,
        required: true,
        trim: true,
    },
    location: {
        type: String,
        required: true,
        trim: true,
        minlength: 1,
    }
});

module.exports = mongoose.model('Hours', hoursSchema);

路线

router.post('/', (req, res) => {
   const body = _.pick(req.body, ['date', 'location']);
   const entry = new Hours(body);
   res.send(entry);
   // rest of code...
});

我发了一个帖子请求,让我们说日期:12 /日期:“12”。 Mongoose将此视为一个时间戳,因为我在日期字段中收到此结果 - 1970-01-01T00:00:00.012Z。我怎么能防止这种情况?当用户以格式yyyy-mm-dd或dd-mm-yyyy发送除日期之外的其他数据时,我想抛出错误

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用快速中间件功能并检查那里的合法输入。您已经可以使用名为express-validator的中间件库。它不包含检查合法日期的功能,因此您必须自己制作。

要检查合法日期,您可以使用此功能(来自here):

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Ethernet.begin(mac, ip); 
  delay(2000);
  Serial.println(F("Ready. Press f or r"));
}

char eData(){
  doFTP();
  delay(15000);
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET http://www.ervesta.com/index.txt HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
  while (client.available()) {
    char c1 = client.read();
    Serial.print(c1);
  }
}

if (!client.connected()) {
  client.stop();
  // do nothing forevermore:
  while (true);
}
return c1;
}

它需要以下格式:YYYY-MM-DD。您可以将它与DD-MM-YYYY的功能结合使用。您可以找到一些示例here

后置控制器之前的中间件功能:

function isValidDate(value) {
  if (!value.match(/^\d{4}-\d{2}-\d{2}$/)) return false;

  const date = new Date(value);
  if (!date.getTime()) return false;
  return date.toISOString().slice(0, 10) === value;
}

该路线将成为:

const dateValidator = [
  check('date')
   .custom(isValidDate)
   .withMessage('the date is illegal')
]

在控制器功能中,您可以从这个检查开始:

router.post('/', dateValidator, (req, res) => {}

如果日期是非法的,用户将收到错误消息。