我使用node-js
和https://www.npmjs.com/package/request开发后端,将请求移交给主api。
已成功以字符串或数字的形式发送数据。但我发送文件有问题。在进入请求模块之前,我已使用
转换来自客户端的所有请求 new formdata()
结束这是我使用NPM请求的代码
export function requestAPI(method='GET', endpoint='', params={}, callback)
{
let token = ''
if(params.token)
{
token = params.token;
delete params.token;
}
//set query
if(params.query)
{
endpoint = `${endpoint}?${Url.serialize(params.query)}`
delete params.query
}
//set options
let options = {
method: method,
uri: `${process.env.API_HOST}${endpoint}`,
timeout: 6000,
headers: {
'auth' : token
},
};
// upload files
// ???
// using POST method
if(method === 'POST') {
options['form'] = params;
}
// is upload a file - request via multipart/form-data
//start request
try {
request( options , function(error, response, body){
if(error)
{
console.log(error)
return callback(httpException(500));
} else //success
{
return callback(JSON.parse(body));
}
})
} catch(err) {
return callback(httpException(500, err.message+', '+err.stack));
}
}
答案 0 :(得分:1)
要发送文件,您需要使用multipart/form-data
而不是application/json
之类的内容。此外,您需要使用formData
选项而不是form
。例如:
var options = {
method: method,
uri: `${process.env.API_HOST}${endpoint}`,
timeout: 6000,
headers: {
'auth' : token,
},
};
// using POST method
if (method === 'POST') {
options.formData = params;
}
然后在params
内,您可以使用request
和/或form-data
模块'文档中列出的任何值。因此,对于本地文件,您只需使用可读的流:
var fs = require('fs');
// ...
params.avatar = fs.createReadStream('avatar.jpg');
对于文件,您可以显式设置不同的文件名和/或mime类型,如相关request
multipart/form-data example中所示。
答案 1 :(得分:1)
感谢帮助人员,最终我找到了解决问题的答案。
这一行的问题
if(method === 'POST') {
options['form'] = params;
}
我只是改为这个,让它有效
if(method === 'POST') {
options['formData'] = params;
}
这是完整的代码
export function requestAPI(method='GET', endpoint='', params={}, callback)
{
let token = ''
if(params.token)
{
token = params.token;
delete params.token;
}
//set query
if(params.query)
{
endpoint = `${endpoint}?${Url.serialize(params.query)}`
delete params.query
}
//set options
var options = {
method: method,
uri: `${process.env.API_HOST}${endpoint}`,
timeout: 30000,
headers: {
'auth' : token
},
};
// using POST method
if(method.toLowerCase() === 'post') {
options.formData = params;
// upload files
if(options.formData.files)
{
const files = options.formData.files
delete options.formData['files']
Object.keys(files).map(n => {
options.formData[n] = {
value: fs.createReadStream(files[n]._writeStream.path),
options: {
filename: files[n].name,
type: files[n].type
}
}
})
}
}
//start request
try {
request( options , function(error, response, body){
if(error)
{
return callback(httpException(500));
} else //success
{
return callback(JSON.parse(body));
}
})
} catch(err) {
return callback(httpException(500, err.message+', '+err.stack));
}
}