Невозможно использовать данные, возвращаемые JSON.parse

Я пытаюсь протестировать API (sails.js) и не могу использовать данные, возвращаемые JSON.parse.

У меня есть этот тест:

describe('when requesting resource /coin', function () {

it ('should request "/Coin" on server and return it', function (done) {
  supertest(sails.express.app)
    .get('/Coin')
    .expect('Content-Type', /json/)
    .expect(200, done)
    .end(function(err, res) {
      var result = JSON.parse(JSON.stringify(res.text));
      assert.equal(result.cash, 1000);
      done();
    })
  })
 })

Здесь вы можете увидеть, как выглядит результат:

Неперехваченная ошибка типа: объект [

{

"userId": "макарио",

"наличные": 1000,

"createdAt": "2014-03-04T20:17:57.483Z",

"updatedAt": "2014-03-07T02:47:51.098Z",

"id": 15

}

][

{

"userId": "макарио",

"наличные": 1000,

"createdAt": "2014-03-04T20:17:57.483Z",

"updatedAt": "2014-03-07T02:47:51.098Z",

"id": 15

} ]

И ошибка:

Uncaught AssertionError: "undefined" == 1000

Я хотел бы использовать эту информацию, но я не могу получить к ней доступ.


person user3391430    schedule 07.03.2014    source источник
comment
Почему вы делаете что-то подобное var result = JSON.parse(JSON.stringify(res.text)); ?   -  person Risto Novik    schedule 07.03.2014
comment
Я понятия не имею. Я следовал руководству, но оно было сосредоточено на узле, после чего я попытался адаптировать некоторые команды. Если есть простой способ получить данные и использовать их, это то, что мне нужно. Я начинаю с этого, и это очень простой API только для обучения.   -  person user3391430    schedule 07.03.2014


Ответы (1)


Ваш ответ в res.text, вероятно, является строкой.

Когда вы stringify строите, кавычки экранируются, что приводит к следующему;

""[{\"userId\":\"macario\",\"cash\":1000,\"createdAt\":\"2014-03-
04T20:17:57.483Z\",\"updatedAt\":\"2014-03-07T02:47:51.098Z\",\"id\":15}]""

Поэтому, когда вы вызываете для него JSON.parse, он просто превращает его обратно в строку, а не в нужный вам объект.

Просто измените эту строку;

var result = JSON.parse(JSON.stringify(res.text));

к этому;

var result = JSON.parse(res.text);

Если parse терпит неудачу, то JSON в res.text имеет неверный формат, и это ваша главная проблема.

person Jivings    schedule 07.03.2014
comment
Да, я уже пробовал это раньше, но, как вы сказали, проблема с форматом на самом деле. Выдается следующая ошибка: Uncaught SyntaxError: Unexpected token [я думаю, что это вызвано скобками [], которые заключают json, я пытаюсь их удалить - person user3391430; 07.03.2014
comment
Скобки должны быть в порядке; они представляют собой массив. Однако в вашем вопросе я не вижу запятой между первым элементом массива и вторым, что могло бы вызвать ошибку. Кроме того, ваш тест выглядит не совсем правильно — вы выполняете запрос find, который возвращает все монеты (отсюда и массив), но проверяете значение cash, как будто вы ожидаете только один результат . Либо проверьте result[0].cash, либо измените запрос на /Coin/15 (или какой-либо другой известный идентификатор) - person sgress454; 07.03.2014
comment
Я наконец нашел ошибку. Я получал двойные кавычки в возвращенном json, я просто изменил .expect(200, done) на .expect(200), и это сработало: D - person user3391430; 08.03.2014