Node.js 如何添加中间件以捕获express上的所有成功请求?

Node.js 如何添加中间件以捕获express上的所有成功请求?,node.js,express,Node.js,Express,我正在尝试将api上的用户活动记录到mongo集合。问题是,当我在路由上方添加中间件时,我可以记录请求。但当时中间件无法知道请求是成功还是失败。如果我在路由下面添加中间件,它将不会被调用 现在,我在每个路由函数的末尾运行res.send()。如果我删除它并尝试只设置状态,那么api就会被卡住(从前面它说是挂起的,而api什么也不做)。你知道怎么做吗 我的app.js: import express from 'express'; import logger from 'morgan'; impo

我正在尝试将api上的用户活动记录到mongo集合。问题是,当我在路由上方添加中间件时,我可以记录请求。但当时中间件无法知道请求是成功还是失败。如果我在路由下面添加中间件,它将不会被调用

现在,我在每个路由函数的末尾运行
res.send()
。如果我删除它并尝试只设置状态,那么api就会被卡住(从前面它说是挂起的,而api什么也不做)。你知道怎么做吗

我的app.js:

import express from 'express';
import logger from 'morgan';
import bodyParser from 'body-parser';
import helmet from 'helmet';
import filter from 'content-filter';
import cors from 'cors';
import dotenv from 'dotenv';
import mongoose from 'mongoose';
import Raven from 'raven';

import { createFirebaseAuth } from 'express-firebase-auth';
import routes from './routes';
import { DB_CONFIG } from './config';
import firebase from './lib/firebase';
import permissions from './middleware/permissions';
import userLogs from './middleware/userLog';

// Setup environment config
dotenv.config();

// Initiate the app
const app = express();

// Connect to the database
mongoose.connect(DB_CONFIG.uri, DB_CONFIG.options);
mongoose.Promise = global.Promise;

// Configure error reporting
if (process.env.RAVEN_DSN) {
  Raven.config(process.env.RAVEN_DSN).install();
  app.use(Raven.requestHandler());
}

// Apply the middleware
app.use(filter());

app.use(helmet.xssFilter());
app.use(helmet.hidePoweredBy());
app.use(helmet.noSniff());
app.use(cors());

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.use(logger('dev'));

// Add the firebase authenticatior
const firebaseAuth = createFirebaseAuth({
  firebase,
  checkEmailVerified: true,
  checkEmailVerifiedIgnoredUrls: ['/users', '/users/updatepassword']
});
app.use(firebaseAuth);

// Add the permissions module
app.use(permissions);


// Add the routes
app.use('/', routes);


// Catch 404 and forward to error handler
app.use((req, res, next) => {
  const err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// The user logs module
app.use(userLogs);

// Configure error reporting
if (process.env.RAVEN_DSN) {
  app.use(Raven.errorHandler());
}


// Error handler
app.use((err, req, res) => {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.send({ error: 'Something failed!' });
});


// Setup the ip and port
app.set('port', process.env.APP_PORT || 8000);
app.set('ip', process.env.APP_IP || '127.0.0.1');

// Start the app
app.listen(app.get('port'), () => {
  /* eslint-disable no-console */
  console.log('***************************************************************');
  console.log(`Server started on ${Date(Date.now())}`);
  console.log(`Server is listening on port ${app.get('port')}`);
  console.log('***************************************************************');
});

module.exports = app;
app.use(用户日志)是我附加日志的地方

我的路由文件如下所示:

const router = express.Router();

const routeHandler = ({ path, callback, method }) => {
  router.route(path)[method](async (req, res, next) => {
    try {
      await callback(req, res, next);
    } catch (error) {
      next(error);
    }
  });
};

routeHandler({ path: '/companies', callback: createCompany, method: 'post' });

routeHandler({ path: '/companies', callback: updateCompany, method: 'put' });
让我们看看updateCompany函数:

export const updateCompany = async (req, res) => {
  const companyData = req.body;

  // Get the data and update the company

  res.send({ message: 'Success!' });
};
用户日志中间件:

const userLogs = async (req, res, next) => {
  console.log(req);
  console.log('--------------------------------------------------------------------------');

};

显示您的代码。仅仅谈论你的代码并不能给出一个清晰的画面。如果我们真的看到了它,那么我们就可以理解你试图做什么,以及哪里出了问题you@Dipakchavda抱歉,添加了代码@NeilLunn抱歉添加了代码!因此,除了忘记在
userLogs
函数中调用
next()。如果你不这样做,事情就会“卡住”。在您对“路由”执行
use
操作之后,实际放置
use(userLogs)
,这是正确的做法。您应该能够检查
res
,只要调用
next()
,就可以了。