到目前为止,我有一个非常基本的RESTful API,我的Express应用程序配置如下:
app.configure(function () {
app.use(express.static(__dirname + '/public'));
app.use(express.logger('dev'));
app.use(express.bodyParser());
});
app.post('/api/vehicles', vehicles.addVehicle);
如果内容类型不是app.post
,我如何/在哪里可以添加阻止请求到达app.get
和application/json
的中间件?
中间件应该只将具有不正确内容类型的请求停止到以/api/
开头的网址。
答案 0 :(得分:19)
如果您使用的是Express 4.0或更高版本,则可以根据处理程序的请求调用request.is()
来过滤请求内容类型。例如:
app.use('/api/', (req, res, next) => {
if (!req.is('application/json')) {
// Send error here
res.send(400);
} else {
// Do logic here
}
});
答案 1 :(得分:18)
这会将中间件安装在/api/
(作为前缀)并检查内容类型:
app.use('/api/', function(req, res, next) {
var contype = req.headers['content-type'];
if (!contype || contype.indexOf('application/json') !== 0)
return res.send(400);
next();
});
答案 2 :(得分:1)
作为替代方案,您可以使用express-ensure-ctype
中间件:
const express = require('express');
const ensureCtype = require('express-ensure-ctype');
const ensureJson = ensureCtype('json');
const app = express();
app.post('/', ensureJson, function (req, res) {
res.json(req.body);
});
app.listen(3000);
答案 3 :(得分:0)
对于输入验证,一个好的模块是express-validator。它提供了进行任何形式的检查所需的中间件。在您的情况下,例如:
const { check, validationResult } = require('express-validator')
app.use('/api/', [
check('content-type').equals('application/json')
], function(req, res, next) {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(422).json({ errors: errors.array() });
}
next();
});
答案 4 :(得分:0)