“代码”:“BAD_USER_INPUT”,在阿波罗服务器错误

时间:2021-03-18 05:32:53

标签: javascript node.js mongodb graphql apollo-server

我正在使用 MERNG 堆栈来开发应用程序。我在 apollo-server 游乐场中收到此错误

{
  "errors": [
    {
      "message": "Errors",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "register"
      ],
      "extensions": {
        "errors": {},
        "code": "BAD_USER_INPUT",
        "exception": {
          "errors": {},
          "stacktrace": [
            "UserInputError: Errors",

在项目中,所有用户输入都是字符串,我的 typeDef.js 看起来像这样

const { gql } = require("apollo-server");

module.exports = gql`
  type Post {
    id: ID!
    body: String!
    createdAt: String!
    username: String!
  }
  type User {
    id: ID!
    email: String!
    token: String!
    username: String!
    createdAt: String!
  }
  input RegisterInput {
    username: String!
    password: String!
    confirmPassword: String!
    email: String!
  }
  type Query {
    getPosts: [Post]
    getPost(postId: ID!): Post
  }
  type Mutation {
    register(registerInput: RegisterInput): User!
    login(username:String!, password:String!):User!
  }
`;

突变 registerInput 的解析器如下所示

const bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
const { UserInputError } = require("apollo-server");

const User = require("../../models/User");
const { SECRET_KEY } = require("../../config");
const {
  validateRegisterInput,
  validateLogin,
} = require("../../utils/validators");
module.exports = {
  Mutation: {
    async register(
      _,
      { registerInput: { username, password, confirmPassword, email } },
      context,
      info
    ) {
      //validate the users
      const { errors, valid } = validateRegisterInput(
        username,
        password,
        confirmPassword,
        email
      );
      if (!valid) {
        throw new UserInputError("Errors", { errors });
      }
      const user = await User.findOne({ username });
      if (user) {
        throw new UserInputError("username exists", {
          errors: {
            username: "username is taken",
          },
        });
      }

      password = await bcrypt.hash(password, 12);
      const newUser = User({
        username,
        email,
        password,
        createdAt: new Date().toString(),
      });

      const res = await newUser.save();

      const token = jwt.sign(
        {
          id: user.id,
          email: user.email,
          username: user.username,
        },
        SECRET_KEY,
        { expiresIn: "1hr" }
      );
      return {
        ...res._doc,
        id: res._id,
        token,
      };
    },
  },
};

我已经在其他文件中定义了所有用户验证。

当我在操场上查询 register 突变时,它的抛出错误如上所述。 查询看起来像这样

mutation{
  register(
    registerInput:{
      username:"user"
      password:"12345678"
      confirmPassword:"12345678"
      email:"hello@gmail.com"
      
    }
  ){
    id
   username
    token
    email
    
  }
}

我知道如果 GraphQL 操作包含无效的字段参数值,我们将收到 BAD_USER_INPUT 错误。 但我想我已经为寄存器提供了正确的输入值。

有人可以帮忙解决代码中的问题吗?

0 个答案:

没有答案