【发布时间】:2018-04-11 21:09:45
【问题描述】:
我有一个快速演示服务器,它回显客户端向它发送的内容。
在学习活动中使用,客户端将使用 fetch API 进行 POST,例如:
fetch('http://localhost:5000/', {
method: 'POST',
body: JSON.stringify({ lab: 'fetch', status: 'fun' }),
headers: messageHeaders
})
数据的body 将是字符串、JSON 或FormData。
我对 express 不是很熟悉,但我希望只有一条路线可以处理所有三种 body 类型。目前我无法弄清楚如何做到这一点。
我从 this SO post 开始,但该解决方案不适用于我的情况 - 我认为 res.format API 不允许我访问请求的正文,它似乎也不适用于多部分表单数据。
相反,我默认在潜在的中间件黑客配置中使用 body-parser 和 multer 包:
// if client POST body is a string, parse as text
app.post('/', bodyParser.text(), (req, res, next) => {
const contentType = req.get('content-type');
if (!contentType.includes('text/plain')) {
return next();
}
res.write(JSON.stringify(req.headers, null, 2))
res.write('\n\n')
res.write(req.body)
res.end()
});
// if client POST body is JSON, parse as JSON
app.post('/', bodyParser.json(), (req, res, next) => {
const contentType = req.get('content-type');
if (!contentType.includes('application/json')) {
return next();
}
res.write(JSON.stringify(req.headers, null, 2))
res.write('\n\n')
res.write(JSON.stringify(req.body, null, 2))
res.end()
});
// if client POST body is FormData, parse as form-data
app.post('/', upload.fields([]), (req, res, next) => {
const contentType = req.get('content-type');
if (!contentType.includes('multipart/form-data')) {
return next();
}
res.write(JSON.stringify(req.headers, null, 2))
res.write('\n\n')
res.write(JSON.stringify(req.body, null, 2))
res.end()
});
是否有更标准或“更好”的模式来实现此功能?也许我只需要编写一个处理程序?
【问题讨论】:
-
我觉得你在那里做的很好,它给你带来了什么问题?
-
没有错误。只是不熟悉 express & 似乎单个处理程序将是一个更好或更规范的模式。我认为服务器框架可以在单个路由中解析不同类型的输入,但我没有找到任何适用于这种情况的示例代码。如果它是合法的,那么我很乐意接受。
-
您可以通过创建
bodyParser等实例,然后附加到它的下一个事件,在一条路线中完成。例如。var bodyparser_text = bodyParser.text();然后在路线内,..if (somecondition) bodyparser_text(req, res, function (req, res) { /*rest of code*/}),或类似的东西.. 未测试.. -
嗯。我尝试了您的建议(至少我对您的建议的错误解释)没有成功。我不认为
bodyParser/etc API 真的支持吗?看起来bodyParser只需要一个options配置对象,并且不直接与其中的回调等一起使用。我想我知道我要做什么了 - 请参阅我建议的答案 -
首先你应该做
app.use(bodyParser.json());然后在你的路线上app.post('/notes', multer.array("files", 5), (req, res)=> {});
标签: javascript node.js express