好吧,这是一个相当广泛的问题,我绝对不是专家,但我会在这里尽力而为。
TL;博士
routes
是控制器,当用户将浏览器导航到应用程序中的特定路径时,它们会告诉执行什么逻辑,包括要呈现哪些视图以及要向这些视图发送哪些数据
models
就是这样 - 应用程序中的数据模型
module.exports =
告诉文件它“导出”的确切内容,即需要从您的主应用程序文件执行或访问的代码。
require(..)
包括一个模块。您可以在变量上设置它,以便您稍后可以调用模块函数,或者如果module.exports
返回的只是执行一个函数。
结合这些技术可以帮助您为任何应用程序确定一个可靠的框架。
长答案
Express为构建 Node.js 应用程序提供了一个可靠的框架。Node 完全独立于 Express,但由于 Express 的受欢迎程度,它们实际上是齐头并进的。安装后,Express 可用于生成一个脚手架 Web 项目(带有选项),如果您愿意,您可以在其上构建。
控制器
将创建一个生成的项目/routes/index.js
,它(如果您了解 MVC)本质上是您的主控制器。express 中的路由是这样写的:
app.get('/path', function(req, res, next){ .. } );
让我们分解一下:我们的应用程序变量 (app) 在 GET 请求中被告知要使用变量(分别为请求、响应、回调)'/path'
执行匿名回调函数。req, res, next
我发现将其视为自定义事件处理程序很有帮助。
在这一点上需要注意的是,我们也可以app.post
使用相同的语法调用帖子到 URL,而不是获取。
在我们的匿名回调中,我们处理任何传入的数据并为用户呈现视图。这是我的大部分业务逻辑的最终结果,因此这里不使用匿名函数实际上是有意义的。这是一个仅显示主页的基本回调示例:
app.get('/', function(req, res, next){
//some business logic
res.render('views/home');
});
当用户尝试获取我们应用程序的索引/
路径home
时views
(
但是,如果我们想将其模块化,这样我们就不会在我们的 mainapp.js
或中声明我们所有的路由server.js
呢?
我们module.exports = ..
在我们的模块中使用来告诉我们的服务器究竟要包含什么。在我的控制器中,我导出了一个函数,该函数将应用程序作为参数并使用它来定义我们的路由,如下所示:
控制器/User.js
module.exports = function(app){
app.get('/users', function(req, res){
var users = req.db.collection('users').find();
if (!users) {
console.log("no users found");
res.redirect('/');
} else {
res.render('users/index', {users : users});
}
});
};
不用担心req.db
代码,我将数据库附加到应用程序中的请求,但默认情况下不会这样做。只需了解我在这里得到了一个“用户”列表,如果没有,则将用户重定向到我的应用程序的索引。
楷模
Mongoose 为我们提供了一个很好的编写模型的界面。使用猫鼬,编写模型是一个三步过程:
下面是一个User
模型示例:
模型/User.js
var mongoose = require('mongoose'),
userSchema = new mongoose.Schema({
name: { type: String, required: true },
joinDate: {type: Date, default: date.now }
}),
User = mongoose.model('user', userSchema);
module.exports = user;
服务器应用
module.exports
用于帮助我们为代码库定义一些模块化。当我们运行一个节点应用程序时,我们最终会运行一个 JavaScript 文件(您已经看到该文件带有server.js
或app.js
)。
为了防止这个文件因多个模型和路由而变得太大,我们使用require(module)
包含来自其他 JS 文件的代码。module
在我们的例子中是我们想要的模块的路径。如果您有以下文档结构:
| Controllers
- User.js
| Models
- User.js
| Views
app.js
要从 中包含您的用户控制器app.js
,您可以编写require('./Controllers/User')
:由于我们的控制器模块只是导出函数,因此我们可以在 require 语句之后立即调用该函数,只需在末尾添加括号(使用所需的任何参数)。包括我的控制器看起来像这样:
require('./Controllers/User')(app)
我传入了实际的应用程序,因为我的模块(如下)只是导出了一个函数,它将业务逻辑添加到我的应用程序的路由中。这只需要被调用并且从不使用,所以我不会将我的控制器捕获为变量以便稍后调用方法。
包括模型有点不同,因为我们可能想要执行我们的模型定义的一些操作。我们可以通过稍微修改一下我们的需求代码来做到这一点:
var User = require('./Models/User');
现在我们可以随时调用 User 模型的方法。Mongoose 免费为我们提供了许多基本功能:
User.find({}, function(err, users){ .. });
上面的函数将找到我们所有的用户,然后执行一个具有潜在可能性的匿名函数err
(如果没有问题,则为 null),然后是 JSON 格式的用户列表。很漂亮。
结合所有这些概念,您可以使用 Express 和 Node.js 创建一个基本的 Web 应用程序。如果有任何关于我如何使用 Express 的说明,请在评论中告诉我。这是非常表面的知识,我建议深入研究文档并查看插件以扩展您的应用程序的功能。祝你好运!