为了更容易验证我的输入,我试图确保只有特定字段设置为true才能创建mongoose文档(此字段当然总是正确的,如果文档实际上是正确创建的,则用于报告原因).
这是一个简化的poc:
var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/playground')
var Schema = mongoose.Schema
var TestSchema = new Schema({
testField: {
type: Boolean,
required: true
}
})
// Try to ensure, that testField can only be true
TestSchema
.path('testField')
.validate(function (testField) {
return (testField === true || testField === 'true')
}, 'Test-field must be true!');
var Test = mongoose.model('test', TestSchema);
var newDoc = Test({
testField: 'some random string'
})
newDoc.save(function (err, newDoc) {
(err) ? console.log(err): console.log('newDoc was created')
})
Run Code Online (Sandbox Code Playgroud)
问题是,即使我提供的是随机字符串而不是布尔值或"布尔字符串"(例如"false"或"true"而不是false/true),文档仍然可以正确保存,标志设置为true. …
我目前正在尝试找出在存储文件之前检查本地文件夹是否存在的“正确”方法,并且nodejs文档有些混乱。
fs.exists()已被废弃,你应该fs.stat()或fs.access()使用。到目前为止,一切都很好。
fs.stat():
不建议在调用fs.open(),fs.readFile()或fs.writeFile()之前使用fs.stat()检查文件是否存在。而是,用户代码应直接打开/读取/写入文件,并在文件不可用时处理引发的错误。
这说明我应该尝试编写,捕获错误,创建文件夹,然后重试。即使我正在移动/重命名文件,我也可以,所以我不直接使用上述三个功能之一。
然后,文档说:
要检查文件是否存在而不随后对其进行操作,建议使用fs.access()。
由于我不是真正在修改文件,而是“仅”修改内容,因此有人可能会认为这是修改的方法。
但是再一次,fs.access()文档详细介绍了为什么这也是一个坏主意:
不建议在调用fs.open(),fs.readFile()或fs.writeFile()之前使用fs.access()检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。而是,用户代码应直接打开/读取/写入文件,并处理无法访问文件时引发的错误。
Yadda yadda yadda,已经有一些相关的问题(here或here),但是是否有不超过两年的“最佳实践”的官方信息?