JSON Ошибка разбора: неожиданный идентификатор "Not" при получении при добавлении заголовка аутентификации JWT - PullRequest
0 голосов
/ 18 января 2020

В настоящее время я работаю над полным стековым приложением для реагирования на денежные переводы, использующим реагирующую и нативную для клиента и нод для сервера. У меня проблема с аутентификацией всех запросов с токеном JWT при отправке серверных вызовов от создателей действий. У меня есть несколько конечных точек, таких как (SignIn, SignUp, Make-Transfer, Get-Recent-User ...) и многое другое.

Мои вызовы API singIn и signUp прекрасно работают с заголовком auth, в то время как все остальные вызовы API завершаются с ошибкой с заголовком auth (JSON Ошибка разбора: неожиданный идентификатор «Not» при получении {конечная точка}) и успешно завершается без заголовка аутентификации. на данный момент, я думаю, что проблема исходит от сервера. возможно из функции промежуточного программного обеспечения JWT. Вот код, с которым я работаю, чтобы лучше понять.

userActions. js

import { AsyncStorage } from 'react-native';
import { IS_USER, ADD_ERROR } from '../constants';
import fetchRequest from '../api/apiFetch';

export const isUserAction = phoneNumber => async dispatch => {
  const userData = await AsyncStorage.getItem('userData');
  const userToken = JSON.parse(userData);
  const { token } = userToken.token;
  const user = await fetchRequest(`/isUser/${phoneNumber}`, {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
      Accept: 'application/json',
      Authorization: `Bearer ${token}`
    }
  });

  if (user) {
    dispatch(checkUser(user));
  } else {
    dispatch(addError(user));
  }
};

const checkUser = userData => ({
  type: IS_USER,
  payload: userData
});

const addError = error => ({
  type: ADD_ERROR,
  payload: 'something went wrong'
});

apiFetch. js

const fetchRequest = async (url, options) => {
  try {
    const req = await fetch(`${BASE_URL}${url}`, options);
    const res = req.status <= 404 ? req : Promise.reject(req);
    return await res.json();
  } catch (e) {
    // eslint-disable-next-line no-console
    console.log(`${e.message} while fetching ${url}`);
  }
};

export default fetchRequest; 

server. js

const koa = require('koa');
const app = new koa();
const cors = require('@koa/cors');
const bodyParser = require('koa-bodyparser');
const config = require('./config/config');
const router = require('./router');
const models = require('./models/db');
const jwt = require('./middleware/jwt');

app
  .use(cors())
  .use(bodyParser())
  .use(jwt)
  .use(router.routes());

(async function () {
  try {
    await models.sequelize.sync();
    app.listen(config.PORT, () => {
      console.log(`server running on ? ${config.PORT}`);
    });
  } catch (error) {
    console.log('unable to connect to the database', error);  
  }
})();

JWT. js

const jwt = require('jsonwebtoken');
const models = require('../models/db');

module.exports = async (ctx, next) => {
  const authorization = ctx.request.headers.authorization;
  const url = ctx.url.split('/')[1];


  if (!authorization && url !== 'signUp') {
    ctx.body = {
      message: 'no auth provided'
    };
    ctx.status = 401;
  }

  if (authorization) {
    const tokenHead = authorization.split(' ');
    if (tokenHead[0] !== 'Bearer') {
      return await next();
    } else {
      const token = authorization.replace('Bearer ', '');

      jwt.verify(token, process.env.JWT_SECRET, async (err, payload) => {
        if (err) {
          ctx.status = 401;
          ctx.body = {
            message: 'Failed to authenticate token'
          };
        }
        const { userId } = payload;

        const user = await models.User.findOne({ where: { id: userId } });
        ctx.user = user;
        next();
      });
    }
  } else await next();
};

userController. js

const models = require('../models/db');

exports.isUser = async ctx => {
  try {
    const phoneNumber = Number(ctx.params.phoneNumber);
    const user = await models.User.findOne({
      where: {
        phoneNumber: phoneNumber
      }
    });

    if (user) {
      console.log('reached here');
      ctx.body = {
        data: {
          id: user.dataValues.id,
          phoneNumber: user.dataValues.phoneNumber
        },
        isUser: true
      };
      console.log("TCL: ctx.body", ctx.body)
      ctx.status = 200;
    } else {
      ctx.body = {
        message: 'user not found',
        isUser: false
      };
      console.log("TCL: ctx.body", ctx.body)
      ctx.status = 204;
    }
  } catch (error) {
    ctx.body = {
      status: 'unsuccessful',
      message: 'something went wrong',
      error: error
    };
    ctx.status = 406;
  }
};

просьба помочь и заранее поблагодарить.

1 Ответ

0 голосов
/ 21 января 2020

Эта ошибка возникает, когда вы передаете строку, не имеющую форму объекта, методу разбора JSON: это может быть один из двух используемых вами методов синтаксического анализа: Похоже, вы пытаетесь json разобрать строку, содержащую буквы Не

  1. В этом случае вы предполагаете, что значение, хранящееся в userData, имеет эту форму "{token:"XAXCVCDASD}", если значение хранится, это не строковый объект , он потерпит неудачу.
 const userData = await AsyncStorage.getItem('userData');
 const userToken = JSON.parse(userData);
 const { token } = userToken.token;


В apiFetch. js вы пытаетесь позвонить res.json(), когда код ответа меньше 404, но вы возвращаете ошибку со статусом 401 в одном из ответов, я полагаю, вы могли пытаться вызвать этот метод для ответа, что тип контента не json формат
const fetchRequest = async (url, options) => {
  try {
    const req = await fetch(`${BASE_URL}${url}`, options);
    const res = req.status <= 404 ? req : Promise.reject(req);
    return await res.json();
  } catch (e) {
    // eslint-disable-next-line no-console
    console.log(`${e.message} while fetching ${url}`);
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...