如何在 Node.js / Express.js 中将中间件放在它自己的文件中
Posted
技术标签:
【中文标题】如何在 Node.js / Express.js 中将中间件放在它自己的文件中【英文标题】:How to put middleware in it's own file in Node.js / Express.js 【发布时间】:2013-02-04 04:21:57 【问题描述】:我是整个 Node.js 的新手,所以我仍在尝试了解事物是如何“连接”的。
我正在尝试使用express-form 验证。根据你可以做的文档
app.post( '/user', // Route
form( // Form filter and validation middleware
filter("username").trim()
),
// Express request-handler gets filtered and validated data
function(req, res)
if (!req.form.isValid)
// Handle errors
console.log(req.form.errors);
else
// Or, use filtered form data from the form object:
console.log("Username:", req.form.username);
);
在 App.js 中。但是,如果我输入 app.get('/user', user.index);
之类的内容,我可以将控制器代码放在单独的文件中。我想对验证中间件做同样的事情(或将验证代码放在控制器中),以便在我开始添加更多页面后更容易查看 App.js 文件。
有没有办法做到这一点?
基本上我想写app.get('/user', validation.user, user.index);
之类的东西
【问题讨论】:
【参考方案1】:这是您定义路线的方式:
routes.js:
module.exports = function(app)
app.get("route1", function(req,res)...)
app.get("route2", function(req,res)...)
这是您定义中间件的方式:
middlewares.js:
module.exports =
formHandler: function(req, res, next)...
app.js:
// Add your middlewares:
middlewares = require("middlewares");
app.use(middlewares.formHandler);
app.use(middlewares...);
// Initialize your routes:
require("routes")(app)
另一种方法是使用您的中间件每条路线:
routes.js:
middlewares = require("middlewares")
module.exports = function(app)
app.get("route1", middlewares.formHandler, function(req,res)...)
app.get("route2", function(req,res)...)
希望我能回答你的问题。
【讨论】:
这是我所追求的每条路线的方法。感谢您的广泛解释 在这个例子中,是否有一个单行来应用 app.js 中的所有 middlewares.js? 在学习 node.js 的几天后,只回答/解释对我有意义的主题。太棒了。【参考方案2】:您可以将中间件函数放入一个单独的模块中,就像控制器函数一样。它只是一个带有适当参数集的导出函数。
因此,如果您有一个validation.js
文件,您可以将您的user
验证方法添加为:
exports.user = function (req, res, next)
... // validate req and call next when done
;
【讨论】:
是的,“适当的参数集”是诀窍 :) 我还没有完全掌握导出/需求关系以上是关于如何在 Node.js / Express.js 中将中间件放在它自己的文件中的主要内容,如果未能解决你的问题,请参考以下文章
如何启用调试 express.js/node.js 应用程序
如何在超级终端中停止运行 Node.js (Express) 服务器
如何使用 Express JS/Railway JS (Node.JS) 生成 JSON
每次在 Node.js (Express.js) 中发出 API 请求之前,如何简化 Fetching Auth token?