2012-08-31 72 views
4

我是Node.JS的新手,无法找到解决方案。 我正在构建一个宁静的服务来从mongo中检索数据。Node.js:无法返回Mongoose查找结果

app.js

var database = require('./database.js'); 
... 

app.get('/metadata', function(req, res) { 
    console.log("GET: metadata"); 
    res.send(database.getMetadata(null)); 
}); 

app.get('/metadata/:id', function(req, res) { 
    console.log("GET: metadata"); 
    res.send(database.getMetadata(req.params.id)); 
}); 
... 

database.js

exports.getMetadata = function (id) { 
    console.log('getting metada...') 
    if (id == null) { 
     return FolderInfo.find({}, null, null, function (err, metadatas) { 
      if (!err) { 
       console.log(metadatas); 
       return metadatas; 
      } else { 
       return console.log(err); 
      } 
     }); 
    } 
    else { 
     return FolderInfo.findById(id, function (err, metadatas) { 
      if (!err) { 
       return metadatas; 
      } else { 
       return console.log(err); 
      } 
     }); 
    } 
} 

我已经尝试了许多不同的方法。但总是得到这样的结果:

{ 
    options: { 
     populate: { } 
    }, 
    _conditions: { }, 
    _updateArg: { }, 
    op: "find" 
} 

但我的console.log(metadatas);行将结果打印到控制台。 我正在使用所有最新的软件包。 有人能帮助我吗?

+0

你的意思是即使你提供了一个ID参数在GET请求中,泛型find(而不是findByID)被调用? – shelman

+0

如果不是,你希望的行为是什么? – shelman

+0

find方法似乎可行,因为回调中的console.log会打印结果,但这不是我回复的结果。 –

回答

9

你真的无法与异步功能的混合同步return就像findById,因为它违背了异步操作的基本性质:“现在退出,以后完全”。

你必须调整getMetadata接受一个回调函数时findById已经完成,可称为:

exports.getMetadata = function (id, callback) { 
    // ... 
}; 

而且,而不是返回metadatas只有当有不是一个err

if (!err) { 
    return metadatas; 
} else { 
    // ... 
} 

无论哪种情况,您都需要拨打callback

callback(err, err ? null : metadatas); 

在上下文中,这可能是:

FolderInfo.find({}, null, null, function (err, metadatas) { 
    if (err) { 
     console.log(err); 
    } else { 
     console.log(metadatas); 
    } 

    callback(err, err ? null : metadatas); 
}); 

或者可能只是:

FolderInfo.find({}, null, null, callback); 

然后通过getMetadata处理该响应的回调函数调用时:

app.get('/metadata', function(req, res) { 
    console.log("GET: metadata"); 
    database.getMetadata(null, function (err, data) { 
     res.send(data); 
    }); 
}); 
+0

谢谢乔纳森!你的回答不仅帮助我解决了我的问题,而且帮助我更多地了解了Node.Js处理事物的方式。 –