Hapi — ответ только в формате JSON

Как я могу настроить функцию ответа Hapi так, чтобы она отвечала только на объекты JSON? Должен ли я отправить его как обычный и отправить? Кажется, я не нашел хорошего примера

Вот некоторые изменения - добавлен пример кода, чтобы понять, что происходит.

Маршрут:

server.route({
    method: 'GET',
    path: '/user/',
    handler: function (request, reply) {

        var ids = null;

        mysqlConnection.query('SELECT ID FROM Users;',function(err,rows,fields){
            if(err) throw err;
            ids = rows;
            // console.log(ids);
            reply(ids);
        });    
    }
});

Ответ:

<html><head></head><body>
<pre style="word-wrap: break-word; white-space: pre-wrap;">[{"ID":1},{"ID":2},{"ID":3},{"ID":4},{"ID":5},{"ID":6},{"ID":7},{"ID":8},{"ID":9},{"ID":10},{"ID":11},{"ID":12},{"ID":13},{"ID":14},{"ID":15},{"ID":16},{"ID":17},{"ID":18},{"ID":19},{"ID":20},{"ID":21}]
</pre></body></html>

person El Dude    schedule 03.02.2015    source источник
comment
Примечание. Объектов JSON нет. JSON всегда является строкой. Вы можете превратить его в объект, проанализировав его. После этого это уже не JSON.   -  person Tomalak    schedule 04.02.2015
comment
Моя догадка? Ваш браузер преобразует JSON для отображения. Hapi должен возвращать строку JSON, как показано.   -  person srlm    schedule 08.02.2015
comment
Да, браузер оборачивает его...   -  person El Dude    schedule 09.02.2015


Ответы (4)


Надеюсь, я правильно понял вопрос. Мы говорим о версии 8.x? Для меня это кажется по умолчанию. Используя этот код в качестве обработчика маршрута,

folders: {
    handler: function( request, reply ) {

        'use strict';
        reply({
            folders: folders
        }).code( 200 );

    }
},

и делать

curl http://localhost:3001/folders

Я получаю следующий вывод

* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3001 (#0)
> GET /folders HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:3001
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: application/json; charset=utf-8
< cache-control: no-cache
< content-length: 266
< accept-ranges: bytes
< Date: Tue, 03 Feb 2015 23:19:31 GMT
< Connection: keep-alive
<
{folders ..... }

Также обратите внимание, что я называю только reply(), а не return reply().

ХТН

person tgo    schedule 03.02.2015
comment
return reply() — это соглашение, указывающее, что метод завершен. См.: github.com/hapijs/hapi/issues/2168. - person zedd45; 27.04.2016

Что касается версии 17 и выше, интерфейс reply() был удален. Теперь обработчики используют асинхронные функции, и вы можете просто вернуть значение.

Из примера hapi docs:

// Before
const handler = function (request, reply) {
    return reply('ok');
};

// After
const handler = function (request, h) {
    return 'ok';
};
person Idan Dagan    schedule 19.12.2017

Использование hapi reply(data) и передача объекта data сделают всю работу за вас. Внутри hapi создаст соответствующий JSON вашего объекта данных и ответит на него.

Существует руководство по как ответить JSON на данный запрос, используя hapi это может дать больше информации.

person Marcus Poehls    schedule 19.10.2016

При использовании v17 и более поздних версий простой возврат пустой строки не приводит к ответу в кодировке json. Используйте return JSON.stringify(), чтобы убедиться, что строка закодирована в формате json.

e.g.

function (request, h) {
    return JSON.stringify('ok');
};
person Phillmac    schedule 21.10.2019