所以我开始使用express.js - 我的第一个JS web开发框架。我没有做任何小事,但开始了一个更大的项目。我正在学习,并在同一时间建设。
来自Python / Flask背景,express似乎非常复杂。
就像在python中一样,如果我想要一个帮助器方法,我可以把它放在文件的顶部,或者放在一个新模块中,然后导入它。超级容易。但是在node / express中,事物是异步的,一切都在exports
或module.exports
(??)中。辅助方法在哪里?如何用回调来呼叫它们?
在another question我问过,我多次进行同样的计算。在Python中,我会编写一个方法(使用if语句和参数),并使用for.. in...
循环多次调用它。我现在的代码非常多余。
我如何在快递中做到这一点?编写快速代码的最佳做法是什么?
答案 0 :(得分:10)
这实际上取决于你的助手在做什么。如果它使用作为参数传递给它的数据进行操作,那么您可以将其保存在外部模块中并使用require
来访问它。
// helpers/FormatString.js
module.exports = function(str) {
return str.toUpperCase();
}
// app.js
var formatter = require("./helpers/FormatString");
但是,如果您需要修改request
或response
对象,那么我建议将其定义为中间件。即:
app.use(function(req, res, next) {
// ... do your stuff here
});
答案 1 :(得分:4)
@Krasimir给出了正确答案。关于如何处理异步辅助函数的问题,我可以给你一个例子(不是通常的foo / bar,而是我自己的辅助函数之一):
var cached; // as modules can act like singletons I can share values here
module.exports = function fetchGoogleCerts(options, callback) { // <-- callback
var now = Date.now();
if (ttl > now && cached) {
callback(null, cached); // <-- return with success
return;
}
request({
uri: options.certsUrl || defaultCertsUrl,
strictSSL: true
}, function (err, response, body) {
var error, certs;
if (!err && response.statusCode === 200) {
certs = jsonParse(body); // a local function
if (!certs) {
callback('parse_error', null); // <-- return an error
return;
}
cached = certs;
// ... more code
callback(null, cached); // <-- success case
} else {
error = {
error: err,
statusCode: response.statusCode
};
log.error(error, 'error fetching google certs');
callback(error); // <-- return an error
}
});
}
};
使用助手:
fetchGoogleCerts = require('./google-certs.js'),
module.exports = function fetchCertsAndDecodeIdToken(token, options, callback) {
fetchGoogleCerts(options, function (err, googleCerts) {
if (err) {
callback({
errorCode: codes.io_error,
errorMsg: 'Unable to fetch Google certificates',
error: err
});
return;
}
decodeAndVerifyGoogleIdToken(googleCerts, token, options, callback);
});
};
如上所示,简单的解决方案是为异步辅助函数提供回调函数。
当然你也可以导出一个扩展EventEmitter
的Object,然后你可能不需要回调函数,但注册事件。这是一个Example for a helper which emits events。