Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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
Javascript 如何使用GraphQL和Mongoose处理多个验证错误?_Javascript_Mongoose_Graphql_Apollo Server - Fatal编程技术网

Javascript 如何使用GraphQL和Mongoose处理多个验证错误?

Javascript 如何使用GraphQL和Mongoose处理多个验证错误?,javascript,mongoose,graphql,apollo-server,Javascript,Mongoose,Graphql,Apollo Server,伙计们。我正在使用Apollo服务器使用一个用户注册解析器,我不确定我们应该如何处理Mongoose模型验证中抛出的多个错误 目前为止,我有一个当前的模型,用于存储我正在开发的这个小应用程序的用户: const userSchema = new Schema({ username: { type: String, required: true, unique: true }, email: { type: S

伙计们。我正在使用Apollo服务器使用一个用户注册解析器,我不确定我们应该如何处理Mongoose模型验证中抛出的多个错误

目前为止,我有一个当前的模型,用于存储我正在开发的这个小应用程序的用户:

const userSchema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    email: {
        type: String,
        required: true,
        validate: {
            validator: (value) => validator.isEmail(value),
            message: (data) => `${data.value} is not a valid e-mail address!`
        },
        unique: true
    },
    digest: String,
});
我正在使用
mongoose unique validator
来确保
username
email
是唯一的,如果不是,就会抛出错误

问题是,我不知道如何处理同时抛出的这两个错误(如果文档为
.save()
d时
电子邮件和
用户名都无效)

我使用GraphQL测试了这个案例,这就是当这些验证都被触发(并且都失败)时得到的结果:

根据我从文档中了解到的情况,我最希望接收一系列可以迭代的错误,但我不确定如何实现这一点,因为Mongoose只是将两个验证错误连接到一个消息中,该消息作为一个单一错误抛出

以下是解析程序:

import bcrypt from 'bcrypt';
import { ApolloError } from 'apollo-server-express';
import validator from 'validator';
import { User } from '../db/db';

const resolvers = {
    Mutation: {
        createUser: (_, args) => {
            const {username, password, email} = args;
            return bcrypt.hash(password, 12)
                .then((digest) => {
                     const doc = { username, digest, email };
                     const newUser = new User(doc);
                     return newUser.save();
                })
                .then((doc) => {
                    return doc;
                })
                .catch((err) => {
                    throw new ApolloError(`Couldn't create user: ${err}`);
                });
        }
    }
};

export default resolvers;
关于如何在
.save()
的承诺中使用
.catch()
,我需要对Apollo Server做些什么吗?我很困惑。我只知道我希望能够在客户机上独立地检查这两个错误(如突出显示输入字段等),所以我想我需要让它抛出一系列错误,而不仅仅是一个“捆绑”错误

想法

import bcrypt from 'bcrypt';
import { ApolloError } from 'apollo-server-express';
import validator from 'validator';
import { User } from '../db/db';

const resolvers = {
    Mutation: {
        createUser: (_, args) => {
            const {username, password, email} = args;
            return bcrypt.hash(password, 12)
                .then((digest) => {
                     const doc = { username, digest, email };
                     const newUser = new User(doc);
                     return newUser.save();
                })
                .then((doc) => {
                    return doc;
                })
                .catch((err) => {
                    throw new ApolloError(`Couldn't create user: ${err}`);
                });
        }
    }
};

export default resolvers;