Объект, возвращаемый с внутреннего сервера, не совпадает с тем, что получено в приложении

#node.js #react-native

#node.js #react-native

Вопрос:

У меня есть react native 0.59 приложение, которое подключается к серверу nodejs. Приложение инициирует fetch запрос на извлечение текущего пользовательского объекта с внутреннего сервера. Вот код для обработки запроса на выборку на сервере:

 router.get('/myself', [auth_deviceid, auth_userinfo], async (req, res) => {
    console.log("myself req.user :", req.user);
    return res.status(200).send(req.user);
});
  

Вот консоль.вывод журнала выше. Возвращается пользовательский объект, как показано ниже:

 user {
  dataValues:
   { id: 1,
     name: 'test uer1',
     email: null,
     cell: '123456789',
     cell_country_code: '1',
     comp_name: null,
     status: 'active',
     role: 'admin',
     device_id: '02f7e7aa907a2a2b',
     user_data: { user_secret: '' },
     last_updated_by_id: null,
     fort_token: '12345678901234567890',
     createdAt: 2019-04-06T07:00:00.000Z,
     updatedAt: 2019-04-06T07:00:00.000Z },
  _previousDataValues:
   { id: 1,
     name: 'test uer1',
     email: null,
     cell: '123456789',
     cell_country_code: '1',
     comp_name: null,
     status: 'active',
     role: 'admin',
     device_id: '02f7e7aa907a2a2b',
     user_data: { user_secret: '' },
     last_updated_by_id: null,
     fort_token: '12345678901234567890',
     createdAt: 2019-04-06T07:00:00.000Z,
     updatedAt: 2019-04-06T07:00:00.000Z },
  _changed: {},
  _modelOptions:
   { timestamps: true,
     validate: { custom_validate: [AsyncFunction: custom_validate] },
     freezeTableName: false,
     underscored: false,
     underscoredAll: false,
     paranoid: false,
     rejectOnEmpty: false,
     whereCollection: { id: '1' },
     schema: null,
     schemaDelimiter: '',
     defaultScope: {},
     scopes: [],
     indexes: [],
     name: { plural: 'users', singular: 'user' },
     omitNull: false,
     sequelize:
      Sequelize {
        options: [Object],
        config: [Object],
        dialect: [PostgresDialect],
        queryInterface: [QueryInterface],
        models: [Object],
        modelManager: [ModelManager],
        connectionManager: [ConnectionManager],
        importCache: {},
        test: [Object] },
     hooks: {},
     uniqueKeys: {} },
  _options:
   { isNewRecord: false,
     _schema: null,
     _schemaDelimiter: '',
     raw: true,
     attributes:
      [ 'id',
        'name',
        'email',
        'cell',
        'cell_country_code',
        'comp_name',
        'status',
        'role',
        'device_id',
        'user_data',
        'last_updated_by_id',
        'fort_token',
        'createdAt',
        'updatedAt' ] },
  __eagerlyLoadedAssociations: [],
  isNewRecord: false }
  

Однако на стороне приложения получен совершенно другой пользовательский объект. Вот вывод консоли:

  'User returned in getuser as: %o', { type: 'default',
04-08 21:21:26.487 12710 12766 I ReactNativeJS:   status: 200,
04-08 21:21:26.487 12710 12766 I ReactNativeJS:   ok: true,
04-08 21:21:26.487 12710 12766 I ReactNativeJS:   statusText: undefined,
04-08 21:21:26.487 12710 12766 I ReactNativeJS:   headers:
04-08 21:21:26.487 12710 12766 I ReactNativeJS:    { map:
04-08 21:21:26.487 12710 12766 I ReactNativeJS:       { date: 'Tue, 09 Apr 2019 04:21:26 GMT',
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         etag: 'W/"14f-/XZLqbaIchn159DwAYBdoQySOWg"',
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         'x-powered-by': 'Express',
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         connection: 'keep-alive',
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         'content-length': '335',
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         'content-type': 'application/json; charset=utf-8' } },
04-08 21:21:26.487 12710 12766 I ReactNativeJS:   url: 'http://192.168.2.133:3000/api/users/myself?_device_id=02f7e7aa907a2a2b',
04-08 21:21:26.487 12710 12766 I ReactNativeJS:   _bodyInit:
04-08 21:21:26.487 12710 12766 I ReactNativeJS:    { _data:
04-08 21:21:26.487 12710 12766 I ReactNativeJS:       { size: 335,
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         offset: 0,
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         blobId: '34fa1356-5846-4577-b4fa-77c99248246c' } },
04-08 21:21:26.487 12710 12766 I ReactNativeJS:   _bodyBlob:
04-08 21:21:26.487 12710 12766 I ReactNativeJS:    { _data:
04-08 21:21:26.487 12710 12766 I ReactNativeJS:       { size: 335,
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         offset: 0,
04-08 21:21:26.487 12710 12766 I ReactNativeJS:         blobId: '34fa1356-5846-4577-b4fa-77c99248246c' } } }
  

_getUser() Это называется асинхронным в componentDidMount . Вот код:

 module.exports._getUser = async () => {
    try {
      let url = `http://192.168.2.133:3000/api/users/myself?_device_id=${encodeURIComponent(DeviceInfo.getUniqueID())}`;
      console.log("getuser url : %s", url);
      let res = await fetch(url, {
        method: "GET",
         headers: {
          "x-auth-token": "mytoken", 
        }
      });
      console.log("User returned in getuser as: %o",  res); 
      return res;

    }
    catch (e) {
      console.log("Error in get myself : ", e);
      return "";
    };

  };
  

Почему пользовательский объект не принимается на стороне приложения?

Комментарии:

1. попробуйте с let responseJson = await res.json();

Ответ №1:

ваш res может быть доступен по адресу res.data или res.data.data .

Если нет, попробуйте JSON.stringify(res) , когда вы регистрируете его, вы увидите, где хранится ваша фактическая информация.

Ответы API всегда состоят из статуса, заголовков, данных и т.д…