#node.js #npm #request
#node.js #npm #запрос
Вопрос:
я разрабатываю серверную часть, используя 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));
}
}
Ответ №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 .
Ответ №2:
спасибо за помощь, ребята, наконец-то я нашел ответ на ее решение.
проблема в этой строке
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));
}
}