Javascript 在使用Mongoose创建对象之前,请检查唯一字段
我正在构建一个GraphQL服务器,在将数据提交到数据库(MongoDB和Mongoose)之前,我需要在其中进行某种验证 其中一个检查与唯一字段相关。所以,一个模型可能有一个或多个唯一字段,我需要能够在保存到数据库之前检查这些字段 因此,我构建了一些帮助函数来完成此操作,代码如下: 助手代码:Javascript 在使用Mongoose创建对象之前,请检查唯一字段,javascript,mongoose,promise,graphql,es6-promise,Javascript,Mongoose,Promise,Graphql,Es6 Promise,我正在构建一个GraphQL服务器,在将数据提交到数据库(MongoDB和Mongoose)之前,我需要在其中进行某种验证 其中一个检查与唯一字段相关。所以,一个模型可能有一个或多个唯一字段,我需要能够在保存到数据库之前检查这些字段 因此,我构建了一些帮助函数来完成此操作,代码如下: 助手代码: import mongoose from "mongoose"; const isFieldUnique = (modelName, fieldName, fieldValue) => {
import mongoose from "mongoose";
const isFieldUnique = (modelName, fieldName, fieldValue) => {
let model = mongoose.model(modelName);
let query = {};
query[fieldName] = fieldValue;
return model.findOne(query).exec();
};
const executeUniquePromises = (uniques, modelName, data) => {
let promises = [];
uniques.map(name => {
let value = data[name];
if (!value)
throw new Error("Cannot test uniqueness for a null field.");
promises.push(
isFieldUnique(modelName, name, value)
.then(value => {
if (value) {
let error = name + ' is not unique';
console.log(error);
return error;
}
console.log(name + ' is unique');
return null;
})
.catch(error => {
throw new Error(error);
})
)
});
return Promise.all(promises);
};
export const checkUniqueness = (uniques, modelName, data) => {
return new Promise((resolve, reject) => {
executeUniquePromises(uniques, modelName, data).then(result => {
let errors = [];
// Check for errors
result.map((error) => {
if (error)
errors.push(error);
});
if (errors.length > 0)
return reject(errors);
else
resolve();
});
});
}
import * as helper from './helper';
schema.statics.create = function (data) {
let uniques = ['name', 'email'];
helper.checkUniqueness(uniques,'Company', data)
.then(result => {
let user = new this(data);
return company.save();
})
.catch(error => {
throw new Error(error);
});
}
const createUser = {
type: UserType,
description: "Create a user",
args: {
data: {
name: "user",
type: new GraphQLNonNull(UserInputType)
}
},
resolve(root, args) {
return UserModel.create(args.data);
}
};
猫鼬静态创建功能:
import mongoose from "mongoose";
const isFieldUnique = (modelName, fieldName, fieldValue) => {
let model = mongoose.model(modelName);
let query = {};
query[fieldName] = fieldValue;
return model.findOne(query).exec();
};
const executeUniquePromises = (uniques, modelName, data) => {
let promises = [];
uniques.map(name => {
let value = data[name];
if (!value)
throw new Error("Cannot test uniqueness for a null field.");
promises.push(
isFieldUnique(modelName, name, value)
.then(value => {
if (value) {
let error = name + ' is not unique';
console.log(error);
return error;
}
console.log(name + ' is unique');
return null;
})
.catch(error => {
throw new Error(error);
})
)
});
return Promise.all(promises);
};
export const checkUniqueness = (uniques, modelName, data) => {
return new Promise((resolve, reject) => {
executeUniquePromises(uniques, modelName, data).then(result => {
let errors = [];
// Check for errors
result.map((error) => {
if (error)
errors.push(error);
});
if (errors.length > 0)
return reject(errors);
else
resolve();
});
});
}
import * as helper from './helper';
schema.statics.create = function (data) {
let uniques = ['name', 'email'];
helper.checkUniqueness(uniques,'Company', data)
.then(result => {
let user = new this(data);
return company.save();
})
.catch(error => {
throw new Error(error);
});
}
const createUser = {
type: UserType,
description: "Create a user",
args: {
data: {
name: "user",
type: new GraphQLNonNull(UserInputType)
}
},
resolve(root, args) {
return UserModel.create(args.data);
}
};
图形SQL代码:
import mongoose from "mongoose";
const isFieldUnique = (modelName, fieldName, fieldValue) => {
let model = mongoose.model(modelName);
let query = {};
query[fieldName] = fieldValue;
return model.findOne(query).exec();
};
const executeUniquePromises = (uniques, modelName, data) => {
let promises = [];
uniques.map(name => {
let value = data[name];
if (!value)
throw new Error("Cannot test uniqueness for a null field.");
promises.push(
isFieldUnique(modelName, name, value)
.then(value => {
if (value) {
let error = name + ' is not unique';
console.log(error);
return error;
}
console.log(name + ' is unique');
return null;
})
.catch(error => {
throw new Error(error);
})
)
});
return Promise.all(promises);
};
export const checkUniqueness = (uniques, modelName, data) => {
return new Promise((resolve, reject) => {
executeUniquePromises(uniques, modelName, data).then(result => {
let errors = [];
// Check for errors
result.map((error) => {
if (error)
errors.push(error);
});
if (errors.length > 0)
return reject(errors);
else
resolve();
});
});
}
import * as helper from './helper';
schema.statics.create = function (data) {
let uniques = ['name', 'email'];
helper.checkUniqueness(uniques,'Company', data)
.then(result => {
let user = new this(data);
return company.save();
})
.catch(error => {
throw new Error(error);
});
}
const createUser = {
type: UserType,
description: "Create a user",
args: {
data: {
name: "user",
type: new GraphQLNonNull(UserInputType)
}
},
resolve(root, args) {
return UserModel.create(args.data);
}
};
助手代码看起来很混乱,我没有将我对承诺的用法与其他承诺一起使用,这是正确的做法
请记住,我可能需要检查几个字段的唯一性,这就是我创建promise数组的原因
一个问题是,当我在没有唯一性匹配的地方插入数据时,我在GraphQL服务器中没有得到任何返回
我想找到一种更好的方法,并找出为什么我无法取回保存的对象。MongoDB已经可以处理现成的对象了。在Mongoose模式中将字段设置为
unique:true
。您可以使用使错误消息与验证错误消息类似。最后,当您无法让unique:true
正常工作时,请阅读。MongoDB已经可以进行开箱即用的处理。在Mongoose模式中将字段设置为unique:true
。您可以使用使错误消息与验证错误消息类似。最后,当您无法使unique:true
正常工作时,请阅读。我知道这一点,但这对我的GraphQL服务器没有用处,因为错误消息将不是应用程序标准。您可以在几行代码中获得与普通验证错误完全相同的消息。唯一的缺点是,普通验证在发送到DB之前运行,而唯一约束由DB本身检查。因此,普通验证消息永远不会与唯一验证消息同时显示。我知道这一点,但这对我的GraphQL服务器没有用处,因为错误消息不是应用程序标准消息。您可以在几行代码中获得与普通验证错误完全相同的消息。唯一的缺点是,普通验证在发送到DB之前运行,而唯一约束由DB本身检查。因此,普通验证消息永远不会与唯一验证消息同时显示。