编写express.js应用程序。辅助方法在哪里?

时间:2014-01-04 21:46:57

标签: javascript node.js express

所以我开始使用express.js - 我的第一个JS web开发框架。我没有做任何小事,但开始了一个更大的项目。我正在学习,并在同一时间建设。

来自Python / Flask背景,express似乎非常复杂。

就像在python中一样,如果我想要一个帮助器方法,我可以把它放在文件的顶部,或者放在一个新模块中,然后导入它。超级容易。但是在node / express中,事物是异步的,一切都在exportsmodule.exports(??)中。辅助方法在哪里?如何用回调来呼叫它们?

another question我问过,我多次进行同样的计算。在Python中,我会编写一个方法(使用if语句和参数),并使用for.. in...循环多次调用它。我现在的代码非常多余。

我如何在快递中做到这一点?编写快速代码的最佳做法是什么?

2 个答案:

答案 0 :(得分:10)

这实际上取决于你的助手在做什么。如果它使用作为参数传递给它的数据进行操作,那么您可以将其保存在外部模块中并使用require来访问它。

// helpers/FormatString.js
module.exports = function(str) {
   return str.toUpperCase();
}

// app.js
var formatter = require("./helpers/FormatString");

但是,如果您需要修改requestresponse对象,那么我建议将其定义为中间件。即:

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