2016-05-11 3 views
4

С функциями Azure, что вам нужно сделать, чтобы вернуть объект JSON в тело из функции, написанной в node.js? Я могу легко вернуть строку, но когда я пытаюсь вернуть объект json, как показано ниже, я, похоже, ничего не вернул.Как вернуть объект JSON из функции Azure с помощью Node.js

context.res = { 
    body: jsonData, 
    contentType: 'application/json' 
}; 
+0

отметить также, что для определения типа содержимого ответа, вы делаете это через коллекцию заголовков ответа, например 'context.res.headers = {'Content-Type': 'text/plain'}'. Как говорит Дэвид ниже, мы по умолчанию используем приложение/json для вас, если ваш ответ json. – mathewc

ответ

3

Если ваши данные являются объектами JS, то это должно просто работать, например.

module.exports = function(context, req) { 
    context.res = { 
     body: { name: "Azure Functions" } 
    }; 
    context.done(); 
}; 

Это вернет ответ application/json.

Если вместо этого у вас есть данные в формате JSON строки, вы можете иметь:

module.exports = function(context, req) { 
    context.res = { 
     body: '{ "name": "Azure Functions" }' 
    }; 

    context.done(); 
}; 

Который будет возвращать application/json ответ, потому что он нюхает, что это действительно JSON.

+0

Всегда ли это работает, то есть req и res всегда неявно доступны, и он всегда будет лучше всего догадываться о типах контента для объектов запроса вывода? Или это только подразумевается, когда ваша функция запускается HTTP-запросом? Насколько я понимаю, только когда функция запускается по запросу http, она неявно добавляет привязки запроса (ввода) и ответа (вывода). Если бы это был какой-либо другой тип тигра, мне нужно было бы вручную добавить привязку вывода ответа, а также неявно знать, добавлять заголовки контента? –

+0

Только для http-запросов есть req/res. Для других типов триггеров, таких как очередь, они запускаются внутри - нет запроса/ответа. – mathewc

+0

Я понял, как функции azure возвращают ответы Json. У меня уровень авторизации является анонимным. когда я вызываю вызов http, я получаю надлежащий ответ в почтальоне, но я не мог получить его, когда я его использую в своем приложении. на копании глубже, я узнал, я получаю ответ, но тело ответа является объектом читаемого потока. Как получить тело ответа? Есть идеи ? @david –

0

Вы также можете использовать JSON.stringify() сделать правильную строку JSON из вашего JS-объекта:

jsonData = { value: "test" }: 

context.res = { 
    body: JSON.stringify(jsonData) 
}; 
+0

Что такое производительность по сравнению с внутренней сериализацией Azure? – jikuja

0

Я хотел бы добавить еще один пункт. Помимо создания тела: объекта JSON, запрос также должен содержать соответствующие заголовки, сообщающие серверу о том, что нас интересует content type. Я мог видеть, что та же самая функция Azure при вызове через браузер с использованием URL-адреса дает ответ XML, но при вызове из сценария или такие инструменты, как почтальон, дают JSON.

1

Я чувствую, что ответ был дан, но он не был четко представлен, поэтому я думал, что отвечу также, если это поможет любому, кто идет позади меня. Я также создал функцию, которая определенно возвращает объект Javascript, но если я скопирую и вставляю URL-адрес в интерфейс Azure Function и просто открываю новую вкладку в Chrome и пытаюсь просмотреть вывод, я действительно возвращаю XML-документ, который сообщает у меня есть ошибка (неудивительно, что есть ошибка, так как многие символы в Javascript взорвали бы XML). Таким образом, как отмечали другие, ключ отправляет соответствующие заголовки с вашим запросом. Когда вы копируете/вставляете URL-адрес в свой браузер, браузер отправляет заголовок запроса, который выглядит примерно так:

текст/html, application/xhtml + xml, application/xml; q = 0.9, image/webp, /;q=0.8

Когда это происходит, вы видите возвращение XML, как описано в этой ссылке: https://github.com/strongloop/strong-remoting/issues/118

для того, чтобы обойти эту проблему и посмотреть, что эти данные будут выглядеть с запросом JSON, либо использовать служебную программу, такую ​​как почтальон: https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en

Accept: application/json 

Sample Postman Header Settings

Или использовать CURL команду и передать в нужном заголовке Accept.

Как вы можете видеть на скриншоте выше, когда я предоставил правильный заголовок, я возвращаю ответ JSON, которого я ожидал бы.

10

Основываясь на моих последних испытаниях (март 2017 года). Вы должны явно добавить тип контента в заголовки ответов, чтобы получить json обратно, иначе данные отображаются как XML в браузере.

"Content-Type": "применение/JSON"

res = { 
    status: 200, /* Defaults to 200 */ 
    body: {message: "Hello " + (req.query.name || req.body.name)}, 
    headers: { 
     'Content-Type': 'application/json' 
    } 
}; 

Полный образец ниже:

module.exports = function (context, req) { 
    context.log('JavaScript HTTP trigger function processed a request.'); 
    context.log(context); 

    if (req.query.name || (req.body && req.body.name)) { 
     res = { 
      // status: 200, /* Defaults to 200 */ 
      body: {message: "Hello " + (req.query.name || req.body.name)}, 
      headers: { 
       'Content-Type': 'application/json' 
      } 
     }; 
    } 
    else { 
     res = { 
      status: 400, 
      body: "Please pass a name on the query string or in the request body" 
     }; 
    } 
    context.done(null, res); 
}; 
+0

где я должен поместить этот код? Я пытаюсь переопределить мой table.read (контекст). У меня есть объект json, который я получил из моего SQL-запроса (я присоединился к двум таблицам). Но я не знаю, как вернуть это. =/ – rafaelbpa

+1

Это помогло мне понять, что хром отправлял принимающие заголовки, которые не должны были переходить с тем, что возвращала функция. Наряду с вкладом Аллена Андервуда, я теперь понимаю, что я должен просто не использовать хром для тестирования api. почтальон отлично работает. –

Смежные вопросы