Node.js:创建具有行动分离的模块

时间:2015-06-24 20:00:44

标签: javascript node.js

我有一个节点应用程序,我采用了以下功能,并将其作为新模块放在新文件夹中的单独文件中。在这个文件中我需要处理一些动作,如保存删除编辑等。我有两个问题:

  1. 我是否应将此文件中的功能与操作分开 以不同的方式揭露它?

  2. 在任何情况下,我应该如何调用此功能 所有操作所需的参数,例如reqrespath

  3. 我正在寻找具体的例子。

    这是我使用的代码:

    module.exports = function () {
      const fs = require('fs')
    
      function fileAction (req, res, urlAction) {
        switch (urlAction) {
    
          case 'save':                  
            const writeStream = fs.createWriteStream('c://myfile.txt', { flags: 'w' })
            req.pipe(writeStream)
            req.on('end', function () {
              console.log('Finish to update data file')
            })
            res.end()
            break
    
          case 'delete':
          case 'update':
          default:
        }
    }
    

2 个答案:

答案 0 :(得分:3)

我喜欢这种方法,而不是在内部实现函数并导出词法范围。

只需使用这种方法,我觉得“导出”的关注与功能的实现是分开的。除此之外,您还可以重命名要导出的功能。最重要的是,您可以更好地控制您想要的东西并且不想出口。

var delete= function(){

};

var update = function(){

};

var save = function(){

};

module.exports.update = update;
module.exports.delete = delete;
module.exports.save = save;

然后,您将能够从主文件中调用方法:

var file = require('./file.js');
file.save();
file.delete();
file.update();

答案 1 :(得分:2)

你应该做一些更面向对象的事情:

module.exports = {

    save: function () {

    },

    delete: function () {

    },

    update: function () {

    }
}

然后,您将能够从主文件中调用方法:

const FileLib = require('./fileLib.js')

FileLib.save()

如果您打算在Express应用程序中将其用作逻辑,除非您正在编写Express中间件或路由器,否则您不需要直接从模块内部使用reqres

但我建议您使用路由器中的库:

const FileLib = require('./fileLib.js')

router.put('/file/:id', function (req, res) {

    // Do your stuff with your library
    FileLib.save(req.param('fileToSave'))

    res.send()
})

你的图书馆不应该太过耦合到Express架构,除非它是一个中间件。

RESTful快速路由也可能是一个好主意。使用HTTP谓词指定您对API的操作。