快速服务器将带有文本字段的多部分表单数据发送到外部 api
Express server sending multipart form data with text fields to an external api
我正在 Express.js 创建休息 API 服务器。我的特定问题的目标是创建一个 post 路由,该路由接受 multipart/form-data 请求并将 file/text/field 发送到外部 API。目前我 运行 遇到了一个问题,甚至试图用 postman.
来测试它
我可以使用来自 multer 的已解析数据发送响应,但是当我尝试创建新的表单数据时,我无法访问请求正文,类型错误:无法读取 属性 'name'空
我做错了什么?有没有更好的办法?接受建议。
我的服务器代码如下:
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/
所以,经过大量的挖掘和尝试,我终于弄明白了。有几件事我需要解决。
- 仍然不确定为什么它不起作用,但我完全删除了新的 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)
}
})
})
我正在 Express.js 创建休息 API 服务器。我的特定问题的目标是创建一个 post 路由,该路由接受 multipart/form-data 请求并将 file/text/field 发送到外部 API。目前我 运行 遇到了一个问题,甚至试图用 postman.
来测试它我可以使用来自 multer 的已解析数据发送响应,但是当我尝试创建新的表单数据时,我无法访问请求正文,类型错误:无法读取 属性 'name'空
我做错了什么?有没有更好的办法?接受建议。
我的服务器代码如下:
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/
所以,经过大量的挖掘和尝试,我终于弄明白了。有几件事我需要解决。
- 仍然不确定为什么它不起作用,但我完全删除了新的 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)
}
})
})