【问题标题】:Express server sending multipart form data with text fields to an external apiExpress 服务器将带有文本字段的多部分表单数据发送到外部 api
【发布时间】:2020-11-21 11:52:15
【问题描述】:

我正在 Express.js 中创建一个 REST API 服务器。我的特定问题的目标是创建一个接受多部分/表单数据请求并将文件/文本/字段发送到外部 API 的发布路由。目前我遇到了一个问题,甚至尝试使用邮递员进行测试。

我可以使用 multer 的解析数据发送响应,但是当我尝试创建新的表单数据时,我无法访问请求正文,TypeError: Cannot read property 'name' of null

我做错了什么?有没有更好的办法?接受建议。

我的服务器代码如下:

const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const request = require("request");
const multer = require("multer");
const upload = multer({ dest: 'uploads/'});
const FormData = require("form-data");
const fs = require("fs");

const app = express();
const port = 3000;

app.use(cors());

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());

///.....

app.post('/jobs/:id', upload.single('resume'), (req, res) => {

    let url = '...';

    var header = req.headers['content-type']

    var tmp_path = req.file.path;
    var tar_path = 'uploads/' + req.file.originalname;
    var src = fs.createReadStream(tmp_path);
    var dest = fs.createWriteStream(tar_path);
    src.pipe(dest);

    var data = new FormData();
    data.append('name', req.body.name)
    data.append('phone', req.body.phone)
    data.append('email', req.body.email)
    data.append('resume', fs.createReadStream(tar_path))
    
    const options = {
        url: url,
        method: 'POST',
        headers:{
            'Content-Type': header
        },
        formData: data
    }

    request(options, (err, rez, body) => {
        if (err){
            console.log("There was an error: " + err)
        }
    }).pipe(res)  

    res.send(res)
})


app.listen(port, () => console.log(`Server is listening on port ${port}`));

编辑

这是我要提出的要求:

curl -F name="test" -F phone="0000000000" -F email="test@test.com" -F resume=@"Desktop/test.txt" http://cfr.thewb.co/jobs/408189/

【问题讨论】:

  • 你能添加你想要做的实际请求吗?也许是curl
  • @eol 我用请求编辑了初始帖子
  • 我猜这个问题来自于同时混合 body-parser 和 multer,但我还没有测试过。如果您删除正文解析器,它会起作用吗? Multer 应该返回基于文本的表单数据。
  • @glmdev 似乎没有什么不同。
  • 尝试用“upload.any()”替换“upload.single('...')”。我相信当你设置单一时,multer 只做文件字段,而不是文本字段。

标签: node.js express multipartform-data multer


【解决方案1】:

所以,经过多次挖掘和玩耍,我终于能够弄清楚了。我需要解决一些问题。

  • 仍然不确定为什么它不起作用,但我完全删除了新的 FormData() 函数并将其变成了一个对象。
  • 我不得不删除 .pipe() 调用,因为它给了我一个循环结构错误。
  • 最后,在我的选项中,我的请求需要在“formData”周围加上引号。

这是清理后的代码:

app.post('/jobs/:id', upload.single('resume'), (req, res, next) => {

    let url = '...';

    var header = req.headers['content-type'];

    function newObj(name,phone,email,resume){
        return{
            name: name,
            phone: phone,
            email: email,
            resume: {
                value: resume.buffer,
                options: resume.originalname
            }
        }
    }
    
    const options = {
        url: url,
        method: 'POST',
        headers:{
            'Content-Type': header
        },
        "formData": newObj(req.body.name,req.body.phone,req.body.email,req.file),
        'auth': {
            'username': PASS,
            'password': KEY,
        }
    }

    request(options, (err, rez, body) => {
        if (err){
            res.send(err)
        }
        if(rez){
            res.send(rez)
        }
    })
    
})

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2013-03-22
    • 2018-03-17
    • 2011-10-23
    • 2019-03-27
    • 1970-01-01
    • 2017-09-06
    • 2018-06-19
    • 2021-09-06
    相关资源
    最近更新 更多