Javascript NodeJS模块中的函数return返回undefined,它';这不是真的

Javascript NodeJS模块中的函数return返回undefined,它';这不是真的,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,在我的NodeJS应用程序中有一个mongo.js模块,我试图在其中检查文档是否存在,如果不存在,则保存到数据库,如果存在,则将错误返回到routes.js文件,该文件调用了模块函数 这是我的模块: var appRoot = require('app-root-path'), config = require(appRoot + '/config/config'), db = require('mongojs').connect(config.db.host); module.exports

在我的NodeJS应用程序中有一个mongo.js模块,我试图在其中检查文档是否存在,如果不存在,则保存到数据库,如果存在,则将错误返回到routes.js文件,该文件调用了模块函数

这是我的模块:

var appRoot = require('app-root-path'),
config = require(appRoot + '/config/config'),
db = require('mongojs').connect(config.db.host);

module.exports = {
    saveSpammer: function(ip, userAgent, fn) {
        var exist = this.find('spammers', {ip:ip, userAgent:userAgent});

        console.log(exist); // returns undefined

        if (!exist) {
            return this.save('spammers', {ip: ip, userAgent: userAgent, date: (new Date())}, fn);
        } else {
            return fn('You have already submitted a request!');
        }
    },

    save: function(col, data, fn) {
        var col = this.getCol(col);

        col.insert(data, {w:1}, function(err, records) {
            if (err) {
                return fn(err);
            } else {
                return fn(null, records);
            }
        });
    },

    find: function(col, query, fn) {
        var col = this.getCol(col);

        col.find(query, function(err, docs) {
            console.log(docs); // returns list of documents from mongo
            console.log(docs ? 1 : 0); // returns 1

            if (docs) {
                return true;
            } else {
                return false;
            }
        });
    }
}
当我在find函数中输出“docs”变量时,我看到了正确的数据,然后基于它,我根据文档的存在返回true或false,问题是从find函数返回到saveSpammer函数会给我“undefined”

我正在使用JavaScript中的常规函数返回,也许我在NodeJS的概念中遗漏了什么


请协助示例中的问题是
col.find()
调用异步执行

所以

是预期的行为,因为
此操作。find
不返回任何内容。您可以看到在
find
函数的定义中没有
return

您需要使用回调机制

this.find('spammers', {ip:ip, userAgent:userAgent}, function(err, exist) {
    console.log(exist);
    .. rest of the code here
});
并使用修改
find
功能

if (err) {
    fn(err);
} else if (docs) {
    fn(null, true);
} else {
    fn(null, false);
}
if (err) {
    fn(err);
} else if (docs) {
    fn(null, true);
} else {
    fn(null, false);
}