Node.js:创build具有操作分离的模块

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

  1. 我应该将这个文件中的function分开到不同的行为吗?

  2. 在任何情况下,我应该如何调用这个function所需的所有参数,如reqrespath

我正在寻找具体的例子。

这是我使用的代码:

 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: } } 

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

 module.exports = { save: function () { }, delete: function () { }, update: function () { } } 

然后你就可以从主文件中调用方法:

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

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

但是我build议你使用你的路由器库:

 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() }) 

除非它是一个中间件,否则你的库不应该被耦合到快速架构。

编写RESTful Express路由也可能是一个好主意。 使用HTTP动词来指定您对API的操作。

我喜欢这种方法比在里面实现函数和导出词法范围更多。

简单地用这种方法,我觉得“出口”的关切与function的实施是分开的。 除此之外,您可以重命名要导出的函数。 最重要的是,你可以更好地控制你想要的,不想出口。

 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();