Javascript 是否可以在不使用中间件功能的情况下增强express.js req和res变量?

Javascript 是否可以在不使用中间件功能的情况下增强express.js req和res变量?,javascript,express,sails.js,Javascript,Express,Sails.js,我在使用express.js的restful服务中工作,我想增强req和res变量,例如,您可以编写 app.use(function (req, res, next) { res.Ok = function (data) { res.status(200).send(data); }; res.InternalError = function (err) { res.status(500).send(err); }; });

我在使用express.js的restful服务中工作,我想增强req和res变量,例如,您可以编写

app.use(function (req, res, next) {
    res.Ok = function (data) {
        res.status(200).send(data);
    };

    res.InternalError = function (err) {
        res.status(500).send(err);
    };
});
后来

router.get('/foo', function (req, res) {
    res.Ok('foo');
})
这将在响应体中发送“foo”,并将状态代码设置为200,并且工作正常

我的第一个问题是,是否可以在没有中间件功能的情况下添加此类功能,比如在app变量的属性或原型中

第二个问题是,如果在应用程序级别使用中间件功能添加许多功能,是否会出现性能问题。这些函数是每个请求附加到请求和响应对象还是在应用程序启动时附加到请求和响应对象


我知道Sails框架已经做到了这一点,但我想知道他们是否也使用中间件功能。

我不知道除了使用中间件之外还有什么其他方法。但在我看来,你可以做以下几点来实现几乎相同的目标

// Some Route
router.get('/foo', function(req, res, next) {
 // ...
 if(err) {
   res.status(500);
   return next(err);
 }
 return res.send('ok');
});

// Another route
router.get('/bar', function(req, res, next) {
  // ...
  if(badUserId) {
    res.status(400);
    return next('Invalid userId.');
  }
  req.result = 'hello';
  return next();
});

router.use(function(req, res) {
  // I prefer to send the result in the route but an
  // approach like this could work
  return res.send(req.result);
});

// Error Middleware
router.use(function(err, req, res, next) {
  if(res.statusCode === 500) {
    // Log the error here
    return res.send('Internal server error');
  } else {
    return res.send(err);
  }
});

我一直在挖掘,结果发现请求和响应对象是使用
\uuuu proto\uuu
属性在express中公开的

var express = require('express'),
app = express();

app.response.__proto__.foo = function (data) {
    this.status(200).send(data);
};
后来在路由器里

router.get('/foo', function (req, res, next) {
    res.foo('test');
});
这将在您的浏览器中打印测试,因此可以在不使用任何中间件的情况下添加功能


注意:我确信这种方法有一些缺点(例如,覆盖express预定义属性),但出于测试目的和添加非常简单的功能,我认为在性能方面稍微好一点。

我不知道为什么,仅仅添加404不是更容易吗,500等。路由结束时的路由?可以使用默认的.status().send()模式,但我将其作为示例。其背后的原因是从更一般的角度增强了默认功能和封装。这种模式也存在于许多框架中(包括构建在express之上的sails),因此这不是一个罕见的用例。