NodeJS模块中的函数返回值未定义,不正确

我在我的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”variables的时候,我看到的是正确的数据,然后基于它返回true或者false,这个问题是从函数find返回的函数saveSpammer给了我“undefined” 。

我正在使用JavaScript中的正则函数返回,也许我错过了NodeJS的概念?

请协助

你的例子中的问题是col.find()调用asynchronous执行。

所以

 var exist = this.find('spammers', {ip:ip, userAgent:userAgent}); console.log(exist); // returns undefined 

是预期的行为,因为this.find不返回任何东西。 你可以看到find函数的定义没有return

您需要使用callback机制

 this.find('spammers', {ip:ip, userAgent:userAgent}, function(err, exist) { console.log(exist); .. rest of the code here }); 

并使用修改findfunction

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