问题描述: 今天在写后台代发请求解决跨域问题的时候,遇到一些报错:
_http_outgoing.js:653 throw new ERR_INVALID_ARG_TYPE('first argument', ^ TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer. Received an instance of Object....
TypeError: str.replace is not a function at Querystring.rfc3986 (C:\Users\User\Desktop\car-rental\car-server\node_modules\request\lib\querystring.js:43:14) at Request.json (C:\Users\User\Desktop\car-rental\car-server\node_modules\request\request.js:1287:30)
先上后端代码
const rp = require('request-promise');
const data = await rp({
uri: '', //目标服务器uri
method: 'post', //请求方式
body: {
body参数
}, //请求数据
headers: {
请求头
},
json: true
});
大概就是这样 然后第二个问题是因为我们写了json:true 在request中 会调用Querystring.prototype.rfc3986
Querystring.prototype.rfc3986 = function(str) {
return str.replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16).toUpperCase()
})
}
这个函数会把body传入,并且调用replace方法,因为body我们写的是对象形式,所以就报错了。这个时候我吧body用json.stringify包了一下,没有报这个错了,但是服务器那边接收的是对象要解析,当传入stringify后,数据失效了,问题依然没有解决。
我又试了下把json:true 去掉后,没有调用replace 但是报了第一个错_http_outgoing.js:653 后来又查了很多资料
最终解决方案 querystring.stringify
const qs = require('querystring');
body: qs.stringify({
}), //请求数据
用这个把body内容包一下 就完美解决问题了 querystring.stringify 也是转成字符串 但是和json.stringify 不一样,将对象转换成字符串,字符串里多个参数将用 ‘&' 分隔,将用 ‘=' 赋值。