【问题标题】:Modular programming in node jsnode js中的模块化编程
【发布时间】:2015-10-03 23:56:38
【问题描述】:

在我们的 node js 应用程序中,所有的 api 调用都在 server.js 中。它是一个有效的应用程序,但我对写在一个文件(即 server.js)中的每个 api 不满意。许多与 node js 应用程序相关的示例都指向在一个名为 app.js 或 server.js 的文件中编写服务器端调用。为了实现代码模块化,我打算将不同文件中的api分开,例如employee.js(与员工相关的数据事务),library.js(与库相关的数据事务)等到各个模块。不确定这是否是正确的方法,因为 node.js 服务器需要在应用程序调用时启动。因此,如果将 api 分发到不同的文件,则需要检查如何一次性启动节点 js 服务器。

此外,我们已将 node-webkit 与应用程序集成。

需要这方面的建议。

【问题讨论】:

  • 看看你是如何实现你的代码会很有帮助的。

标签: javascript node.js node-webkit


【解决方案1】:

您可以使用express中间件和node.js中的默认模块系统来实现这一点。保持代码模块化和分离是一个很好的做法。 一种常见的方法是为所有不同的路由/控制器添加单独的文件夹(在您的情况下为员工) 像这样的

app.js

const express = require('express')
const app = express()

const employeeController = require('./controller/Employee');
const managerController = require('./controller/Manager');

app.use('/employee', employeeController);
app.use('/manager', managerController);


app.listen(3000, () => console.log('App listening on port 3000!'))

./controller/Employee/index.js

const express = require('express')
const router = express.Router()

router.get('/list', (req, res) => {
  res.send('Employee list')
});
router.get('/view', (req, res) => {
  res.send('Employee view')
});

module.exports = router

./controller/Manager/index.js

const express = require('express')
const router = express.Router()

router.get('/list', (req, res) => {
  res.send('Manager list')
});
router.get('/view', (req, res) => {
  res.send('Manager view')
});

module.exports = router

您甚至可以在这里使用 express-generator https://expressjs.com/en/starter/generator.html 获得现成的样板 MVC 代码结构。但是我建议根据您的需要来构建您的项目。

【讨论】:

    【解决方案2】:

    node.js 最棒的事情之一是它的模块系统(您可以在文档中阅读它:https://nodejs.org/api/modules.html),它为您提供了您想要从一千行文件中选择的每个粒度选项到只导出一个常量的文件。

    所以只需将代码拆分到文件中,module.exports = thatthingyouwanttoexport,然后将 require('./it') 拆分回 app.js。如果您在顶层而不是在 app.js 的任何回调中执行此操作,那么它将在您的应用程序开始时完成。

    几个问题:

    • 所需的模块已缓存,因此需要它两次不会执行您的文件两次,它可能很有用(例如,对于单例),但仍然需要注意;
    • 你只导出你正在导出的东西,所以没有全局变量

    一个有用的模式是导出函数,它接受参数并在调用时进行初始化,如下所示:

    //accum.js
    var start = 0
    module.exports = function initaccum(step) {
        return function accum() {
            start += step;
            return start;
        }
    }
    
    //app.js
    var accum = require('./accum.js')(1);
    var http = require('http')
    http.createServer(function(req, res) {
        res.end(accum());
    }).listen(8080);
    

    希望这会有所帮助。

    【讨论】:

    • 是的,我实现的方法是一样的。但是,忘记在这篇文章中回答了。感谢您分享您的想法!!!!这肯定会对寻找相同问题的其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-04-19
    • 2011-07-23
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多