Node.js 如何添加中间件以捕获express上的所有成功请求?
我正在尝试将api上的用户活动记录到mongo集合。问题是,当我在路由上方添加中间件时,我可以记录请求。但当时中间件无法知道请求是成功还是失败。如果我在路由下面添加中间件,它将不会被调用 现在,我在每个路由函数的末尾运行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
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()
,就可以了。