如何使用ExpressJS检查Content-Type?

时间:2014-04-24 14:04:45

标签: node.js express

到目前为止,我有一个非常基本的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.getapplication/json的中间件?

中间件应该只将具有不正确内容类型的请求停止到以/api/开头的网址。

5 个答案:

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

只需使用req.is()

https://expressjs.com/en/api.html#req.is

在这种情况下

if(req.is('json'))