使用来自新Formdata的NPM请求上传文件()

时间:2016-10-03 08:50:39

标签: node.js npm request

我使用node-jshttps://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));
    }
}

2 个答案:

答案 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));
    }
}