如何在Express应用中全局将res.render替换为res.json返回JSON
现有代码的问题
- 两个版本的中间件均未调用
next(),请求无法进入后续业务路由;如果你实际能收到HTML响应,大概率是你将该中间件注册在了所有路由定义的后方——Express的中间件和路由按注册顺序执行,放在路由后的重写逻辑完全没有执行机会 res.json()传参错误:res.json()仅接收待序列化的JSON数据作为核心参数,你传入的res、view、callback都属于无效参数- 未正确解析
res.render入参:res.render(view, options, callback)的第二个参数options才是模板渲染用到的业务数据,仅需要把该对象返回即可 - 未加开发环境判断,不符合你的需求
正确实现
注意:必须将该中间件注册在所有路由定义的前面
// 仅开发环境启用替换逻辑 if (process.env.NODE_ENV === 'development') { app.use((req, res, next) => { // 重写render方法 res.render = function (view, options, callback) { // 兼容render方法的入参变体:第二个参数为回调的场景 if (typeof options === 'function') { callback = options options = {} } // 如果需要一并返回res.locals上挂载的全局变量,可以用 {...res.locals, ...options} res.status(200).json(options) // 兼容业务代码中传入callback的场景,不需要可以删除 if (typeof callback === 'function') { callback(null, JSON.stringify(options)) } } next() }) }
内容的提问来源于stack exchange,提问作者Curcuma_
相关产品推荐
相关产品推荐

