node.js - 想要弄清楚NodeJS应用程序结构(完整的JavaScript堆栈)

最佳答案

好的,这是一个相当广泛的问题,我绝对不是专家,但我会尽力而为。

TL; DR

  • routes是 Controller ,它们告诉用户当用户将其浏览器导航到您应用内的特定路径时要执行什么逻辑,包括要呈现哪些 View 以及向这些 View 发送哪些数据
  • models就是这样-应用程序中的数据模型
  • module.exports =告诉文件“导出”的确切内容,即需要从主应用程序文件执行或访问的代码。
  • require(..)包含一个模块。您可以在变量上设置它,以便稍后可以调用模块函数,或者如果module.exports返回的只是所有函数,则只需执行一个函数即可。

  • 结合这些技术可以帮助您确定适用于任何应用程序的可靠框架。

    详细答案

    Express提供了一个用于构建Node.js应用程序的可靠框架。 Node完全独立于Express,但是由于Express的流行程度,它们实际上是并驾齐驱的。安装后,Express可以用于生成一个脚手架Web项目(带有选项),供您根据需要构建。

    Controller

    生成的项目将创建/routes/index.js,它(如果您了解MVC)实际上是您的主 Controller 。 Express中的路线是这样写的:
    app.get('/path', function(req, res, next){ .. } );
    

    让我们来分解一下:我们的应用程序变量(app)被告知,在对'/path'的GET请求上执行带有req, res, next变量的匿名回调函数(分别是请求,响应和回调)。我发现将其视为自定义事件处理程序很有帮助。

    在这一点上需要注意的重要一点是,对于URL的帖子(而不是get),我们也可以使用相同的语法调用app.post

    在匿名回调中,我们处理所有传入数据并为用户呈现 View 。这是我大多数业务逻辑的结局,因此在这里不使用匿名函数实际上是有意义的。这是仅显示主页的基本回调的示例:
    app.get('/', function(req, res, next){
    
        //some business logic
    
        res.render('views/home');
    });
    

    当用户尝试获取应用程序的索引路径(/)时,我们仅呈现home View ,该 View 从项目的根目录存储在views文件夹中。

    但是,如果我们希望对此进行模块化以免不在主要app.jsserver.js中声明所有路线,该怎么办?

    我们在模块中使用module.exports = ..来告诉我们的服务器确切包含什么。在我的 Controller 中,我导出了一个函数,该函数将应用程序作为参数,并使用该函数来定义我们的路由,如下所示:

    Controller /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 为我们提供了一个编写模型的绝佳界面。对于 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.jsapp.js看到了该文件)。

    为了防止此文件在多个模型和 route 变得太大,我们使用require(module)包含其他JS文件中的代码。在我们的情况下,module将是我们想要的模块的路径。如果您具有以下文档结构:
    | Controllers
        - User.js
    | Models
        - User.js
    | Views
    app.js
    

    要包含app.js中的用户 Controller ,您应该编写:require('./Controllers/User')。由于我们的 Controller 模块只是导出函数,因此我们可以在require语句后立即调用该函数,只需在其末尾添加括号即可(带有所需的任何参数)。包括我的 Controller 如下所示:
    require('./Controllers/User')(app)
    我要传递实际的应用程序,因为我的模块(下面)只是导出一个函数,该函数将业务逻​​辑添加到我的应用程序的路由中。这仅需要被调用且从不使用,因此我不会将我的 Controller 捕获为变量以在以后调用方法。

    包含模型有些不同,因为我们可能要执行模型定义的某些操作。我们可以通过稍微修改一下需求代码来做到这一点:
    var User = require('./Models/User');
    现在,我们可以随时调用User模型的方法。 Mongoose 免费为我们提供了许多基本功能:
    User.find({}, function(err, users){ .. });
    上面的函数将查找我们的所有用户,然后执行一个带有潜在err的匿名函数(如果没有问题,则为null),然后执行JSON格式的用户列表。很漂亮

    结合所有这些概念,便可以使用Express和Node.js创建基本的Web应用程序。如果在使用Express方面有什么我需要澄清的地方,请在评论中让我知道。这是非常基础的知识,我建议深入研究文档并查看插件以扩展您的应用程序的功能。祝你好运!

    https://stackoverflow.com/questions/21831119/

    上一篇:mongodb - node.js 的 mongoose 中的十进制/ float

    下一篇:node.js - 同步连接mongodb

    相关文章:

    node.js - 如何获取 `app.all()` 中的请求方法类型?

    node.js - 使用 Intellij 调试 grunt

    mongodb - Mongodb聚合中的求和数组元素

    javascript - "Mongoose mpromise is deprecated"

    node.js - Sequelize,实例化后如何更改值?

    node.js - 你能用jade只渲染你的html的动态部分...而不弄乱你的html的其余部分吗

    javascript - 路由内的 Express.js http 调用不更新变量

    node.js - angular 可以在 Jade 模板中使用吗?

    node.js - 如何在 Feathersjs 身份验证中创建自定义 HashPassword 函数

    MongoDB 建议请求

    相关文章:

    Mongodb - 删除数组字段中所有元素的正确方法?

    python - pymongo-如何为字段以及其他查询参数设置不同的值

    node.js - 同步连接mongodb

    mongodb - 在 mongodb 中删除重复文档的最快方法

    mongodb - 为什么不用mongodb?

    mongodb - 使用 Mongo 集合中的特殊字符

    node.js - 当 mongodb 的好处应该是无模式时,为什么 mongoose 使用模式?

    javascript - 如何在 MongoDB 中查询引用的对象?

    javascript - 如果 .find() mongoose 没有找到任何东西,请执行某些操作

    node.js - Node.js 上 MongoDB 连接的最佳实践是什么?