Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用自定义验证器时出现Mongoose验证错误_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 使用自定义验证器时出现Mongoose验证错误

Node.js 使用自定义验证器时出现Mongoose验证错误,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,以下是无法正确使用自定义验证器的架构- var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ email : { type: String, validate: lengthValidator }, }); // Length validator for email var lengthValidator = function(val){ if(val && val

以下是无法正确使用自定义验证器的架构-

var mongoose = require('mongoose');
var userSchema = new mongoose.Schema({
    email : { type: String, validate: lengthValidator },
});

// Length validator for email
var lengthValidator  = function(val){
    if(val && val.length >= 6  )
        return true;
    return false;
};

var User = mongoose.model('User',userSchema);

module.exports = User;
错误-

Error: Invalid validator. Received (undefined) undefined. See http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate
    at SchemaString.SchemaType.validate (/MY_PROJECT_PATH/node_modules/mongoose/lib/schematype.js:416:13)
    at SchemaString.SchemaType (/MY_PROJECT_PATH/node_modules/mongoose/lib/schematype.js:38:13)
    at new SchemaString (/MY_PROJECT_PATH/node_modules/mongoose/lib/schema/string.js:24:14)
    at Function.Schema.interpretAsType (/MY_PROJECT_PATH/node_modules/mongoose/lib/schema.js:367:10)
    at Schema.path (/MY_PROJECT_PATH/node_modules/mongoose/lib/schema.js:305:29)
    at Schema.add (/MY_PROJECT_PATH/node_modules/mongoose/lib/schema.js:217:12)
    at new Schema (/MY_PROJECT_PATH/node_modules/mongoose/lib/schema.js:73:10)
    at Object.<anonymous> (/MY_PROJECT_PATH/models/users.js:2:18)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
但是,如果我删除了
validate
,则当我将类型从
String
更改为
Number
时,它工作正常


让我知道我做错了什么?

您遇到的问题与提升有关。编写验证函数的方式意味着在将其传递到模式时,它是一个未定义的值;直到后来变量才被设置

这里有一个关于这个问题的基本例子

var thing = {
    foo: bar
}

var bar = function () {
    alert('hello!');
}

thing.foo();
当调用
thing.foo()
时,它将抛出一个错误。为什么?因为这就是JavaScript解释我所写内容的方式:

var bar;

var thing = {
    foo: bar // At this point, bar is undefined
}

bar = function () {
    alert('hello!');
}

thing.foo();
同样的事情也发生在你的代码上。当您将架构中的validate属性设置为
lengthValidate
时,尚未定义该属性

有两种方法可以解决这个问题

  • 将验证函数定义移到代码中模式定义的上方
  • 使用
    function lengthValidator(val)
    代替
    var lengthValidator=function(val)

  • @MatthewTole我没有收到任何错误,但也没有进行验证。这是一种方法,但我得到的只是“尝试”,即使我的电子邮件长度为2,您也不能多次调用
    res.send
    ,第一次调用将结束响应。@MatthewTole现在我在注释
    res.send('try')后得到一个空白数组
    []
    这可能是因为您没有得到任何结果。是的,但我认为它应该在发送到db之前首先进行验证。因为只有模式验证似乎是相关的,即我应该在错误中得到
    错误的
    响应