使用 NodeJs 和 Express 构建 REST API:我的目标是实现 2 个最简单的中间件
:
- 第一个将记录传入的请求
- 第二个将记录处理后的响应(这是一个
JSON
)
第一个中间件(在app.js中)
function logReqMiddleware(req, res, next) {
log.info('>>> %s at %s', req.method, req.path);
next();
}
第二个中间件(在app.js中)
function logResponseMiddleware(req, res, next) {
log.info('<<< %s (%s)', JSON.stringify(res), res.status);
next();
}
Controller 函数(在 apiController.js 中)
export var router = express.Router();
router.get('/', foo);
function foo(req, res, next) {
res.status(200).json({ stupidExample: true });
next();
}
构建应用(app.js)
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(logReqMiddleware);
app.use('/api', apiController.router);
app.use(logResponseMiddleware);
var server = app.listen(3000, function(){ log.info('running'); });
现在,在 localhost:3000/api
发出请求会显示:发送后无法设置 header
; this is the related super cool response我的问题是,使用 json() 写入 json 数据并添加第二个中间件是否不兼容?我该如何解决这个问题?
最佳答案
不要在logResponseMiddleware
内调用next()
。没有其他事情可做,因此调用 next()
可能会将您发送到 Express 的默认 404 处理程序,该处理程序会尝试使用默认状态和正文进行响应。
旁白:JSON.stringify(res)
不是您想要的。 res 是一个表示响应的对象实例(许多方法、内部状态属性等)。它不是响应正文内容字符串。由于 res
是一个可写流,因此它不会保留响应正文内容供您记录,它只是尝试通过 HTTP 连接发送它。
关于javascript - Express:在 json() 之后调用 next() - 中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33016269/