Node.JS Express API - Цепочка обещаний, включая цепочку запросов-обещаний - ERR_INVALID_HTTP_TOKEN - PullRequest
0 голосов
/ 30 января 2020

У меня есть цепочка получения информации с сервера Sql, а затем настройка данных, которые затем отправляются в API по почте. Проблема в том, что я получаю это RequestError сообщение, ** "TypeError [ERR_INVALID_HTTP_TOKEN]: имя заголовка должно быть действительным токеном HTTP [" key "]"

Objective

-Получить данные, используя идентификатор -Формат данных -Отправить новый, отдельный запрос к API с отформатированными данными -Решить результаты, возвращенные из вызова API

маршрутизатор. js

    router.get('/request/:id', controller.data_post)
    module.exports = router

Контроллер. js


    exports.data_post = function(req, res) {

        ...

        RetrieveData( req.id ) //retrieves data
        .then( results => { //format data

           var obj = formatData(results);
           let body = [];
           body.push(obj);

           return body //resolve formatted data
         } //End Of Promise
        })
       .then( body => { //Send new, separate request to an api with formatted data

             var options = :{
                 method: 'POST',
                 uri: 'url',
                 headers: {
                     'key':'value',
                     'Content-Type': 'application/json'
                 },
                 body: JSON.stringify(body),
                 json:true
         }

         return option
         })
        .then( results => {
          //send results
        })
        .catch( error => {
         //error routine
        }) 
    }           


RetrieveData . js

    function RetrieveData( id ){
      const promise = new Promise((resolve, reject) => {
         ...
         resolve(data)
      }
      return promise;
    }

RequestUtility. js

    const request = require('request-promise')

    function requestutility(options) {
       return request(options)
       .then( response => {
           return response;
       }) 
       .catch( error => {
          return error;
        })
    }

Текущая ошибка

  • "name" : "RequestError",
  • сообщение ":" TypeError [ERR_INVALID_HTTP_TOKEN]: имя заголовка должно быть действительным HTTP-токеном ["ключ"] ",
  • опция с: Объект {},
  • callback : функция RP $ callback (err, response, body) {

    • arguments : TypeError: 'caller Свойства ',' callee 'и' arguments 'не могут быть доступны для функций строгого режима или объектов аргументов для обращения к ним
    • caller : TypeError: свойства caller, callee и arguments не доступны для функций строгого режима или объектов аргументов для их вызова }

1 Ответ

1 голос
/ 30 января 2020

Пара проблем, которые я вижу здесь

  • Вам не нужно возвращать Promise.resolve и Promise.reject в методе служебной программы запроса. Поскольку запрос обещания возвращает обещание, ваше обещание будет выполнено в случае успеха и отклонено в случае ошибки. Таким образом, вы можете полностью избавиться от requestutility.

  • Вы переносите результаты в new Promise, что не требуется.

  • resolve( requestutility(option)) не работает то, как вы ожидаете, что оно будет работать, так как оно будет преобразовано в обещание вместо значения.
  • Удалите ключ из заголовков. Я пытался обновить код. Это должно выглядеть как
const request = require("request-promise");

RetrieveData(id)
  .then(results => {
    const obj = formatData(results);
    const body = [];
    body.push(obj);
    return body;
  })
  .then(body => {
    const options = {
      "method": "POST",
      "uri": "url",
      "headers": {
        "key": "value",
        "Content-Type": "application/json"
      },
      "body": JSON.stringify(body),
      "json": true
    };

    return request(options);
  })
  .then(results => {
    // send results
  })
  .catch(error => {
    // error routine
  });

...