我有一个节点应用程序,我采用了以下功能,并将其作为新模块放在新文件夹中的单独文件中。在这个文件中我需要处理一些动作,如保存删除编辑等。我有两个问题:
我是否应将此文件中的功能与操作分开 以不同的方式揭露它?
在任何情况下,我应该如何调用此功能
所有操作所需的参数,例如req
,res
,path
?
我正在寻找具体的例子。
这是我使用的代码:
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:
}
}
答案 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中间件或路由器,否则您不需要直接从模块内部使用req
和res
但我建议您使用路由器中的库:
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的操作。