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;
})
}
当前错误
- "name": "RequestError",
- 消息: "TypeError [ERR_INVALID_HTTP_TOKEN]: Header name must be a valid HTTP token ["密钥"]",
- 选项s: 对象{},
callback: 函数 RP$callback(err, response, body) {
- arguments:TypeError: 'caller'、'callee' 和 'arguments' 属性可能无法在严格模式函数或参数对象上访问打电话给他们
- caller:TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects给他们打电话
}
我在这里看到了几个问题
您不需要在请求实用程序方法中 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
});
我的链正在从 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;
})
}
当前错误
- "name": "RequestError",
- 消息: "TypeError [ERR_INVALID_HTTP_TOKEN]: Header name must be a valid HTTP token ["密钥"]",
- 选项s: 对象{},
callback: 函数 RP$callback(err, response, body) {
- arguments:TypeError: 'caller'、'callee' 和 'arguments' 属性可能无法在严格模式函数或参数对象上访问打电话给他们
- caller:TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects给他们打电话
}
- arguments:TypeError: 'caller'、'callee' 和 'arguments' 属性可能无法在严格模式函数或参数对象上访问打电话给他们
我在这里看到了几个问题
您不需要在请求实用程序方法中 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
});