Node.JS Express API - Promise Chain 包括 Request-Promise 链 - ERR_INVALID_HTTP_TOKEN

Node.JS Express API - Promise Chain including Request-Promise chain - ERR_INVALID_HTTP_TOKEN

我的链正在从 Sql 服务器检索信息,然后设置数据,然后通过 post 发送到 api。问题是我收到此 RequestError 消息,**"TypeError [ERR_INVALID_HTTP_TOKEN]: Header name must be a valid HTTP token ["key"]"

Objective

-使用 id
检索数据 -格式化数据
- 向 api 发送新的单独请求,其中包含格式化数据
-解析api调用

返回的结果

router.js

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

Controller.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;
        })
    }

当前错误

我在这里看到了几个问题

  • 您不需要在请求实用程序方法中 return Promise.resolve 和 Promise.reject。由于请求承诺 return 是一个承诺,您的承诺将在成功时得到解决,并在错误时被拒绝。所以你可以完全摆脱 requestutility。

  • 您将结果包装在 new Promise 中,这不是必需的。

  • resolve( requestutility(option)) 无法按照您期望的方式工作,因为它将解析为承诺而不是价值。
  • 从 headers 中删除密钥。 我试图更新代码。它应该看起来像
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
  });