Загрузить файл с помощью NPM-запроса из new Formdata()

#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));
    }
}