JSON-тип node-mysql возвращается в кавычках с обратной косой чертой

0

Я пытаюсь получить данные типа JSON из Mysql в приложении Node.js через модуль node-mysql.

выполнение этого запроса в БД:

SELECT countries.id,
   countries.country_name,
   Json_object("start", start_port, "end", end_port)
   ten_minutes,
   Json_object("start", start_port + 10000, "end", end_port + 10000)
   one_minutes,
   Json_object("start", start_port + 20000, "end", end_port + 20000)
   thirty_minutes
FROM   countries
   JOIN countries_port_ranges
     ON country_id = countries.id;

вернуть:

1   Afghanistan {"start": 8000, "end": 8029}    {"start": 18000, "end": 18029}  {"start": 28000, "end": 28029}
2   Albania {"start": 8030, "end": 8059}    {"start": 18030, "end": 18059}  {"start": 28030, "end": 28059}
3   Algeria {"start": 8060, "end": 8089}    {"start": 18060, "end": 18089}  {"start": 28060, "end": 28089}

когда я запускаю этот запрос через node-mysql или Sequelize, я получаю этот результат:

 [{
    "id": 1,
    "country_name": "Afghanistan",
    "ten_minutes": "{\"start\": 8000, \"end\": 8029}",
    "one_minutes": "{\"start\": 18000, \"end\": 18029}",
    "thirty_minutes": "{\"start\": 28000, \"end\": 28029}"
},
{
    "id": 2,
    "country_name": "Albania",
    "ten_minutes": "{\"start\": 8030, \"end\": 8059}",
    "one_minutes": "{\"start\": 18030, \"end\": 18059}",
    "thirty_minutes": "{\"start\": 28030, \"end\": 28059}"
},
{
    "id": 3,
    "country_name": "Algeria",
    "ten_minutes": "{\"start\": 8060, \"end\": 8089}",
    "one_minutes": "{\"start\": 18060, \"end\": 18089}",
    "thirty_minutes": "{\"start\": 28060, \"end\": 28089}"
}] 

app.js:

async (req, res) => {
    const q = 'SELECT...'
    const query = await sequelize.query(q, { type: sequelize.QueryTypes.SELECT })
    res.send(query)
}    

Мой вопрос is- Как я могу получить чистый JSON (без обратной косой черты), а не как экранированную строку?

Ожидаемый результат :

{
    "id": 3,
    "country_name": "Algeria",
    "ten_minutes": {"start": 8060, "end": 8089},
    "one_minutes": {"start": 18060, "end": 18089},
    "thirty_minutes": {"start": 28060, "end": 28089}
}

** Избегайте редактирования возвращаемых данных снова (путем запуска некоторой функции карты).

Благодарю.

  • 0
    попробуйте res.send (query.toJson ())
  • 0
    это не работает
Показать ещё 1 комментарий
Теги:
sequelize.js

1 ответ

0

Следуя ссылке, предоставленной @vedran-maricevic -

Причина этого в том, что node-mysql передает строки данных как json и включает в себя строки json внутри и -

если вы примените JSON.stringify() к тому, что уже является json-строкой, вы получите строку json с двойным кодированием.

Применение JSON.parse() для каждого объекта json не будет работать и будет вызывать ошибку, потому что это уже json-объект.

Поэтому быстрое и грязное решение заключается в применении JSON.parse() только для двухкодированных полей:

const _parsed = query.map(obj => {
        const tmp = {}
        tmp.id = obj.id
        tmp.country_name = obj.country_name
        tmp.ten_minutes = JSON.parse(obj.ten_minutes) // double-encoded field
        tmp.one_minutes = JSON.parse(obj.one_minutes) // double-encoded field
        tmp.thirty_minutes = JSON.parse(obj.thirty_minutes) // double-encoded field
        return tmp
    })
    res.send(parsed)

Надеюсь, это поможет кому-то :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню