从callback中返回一个值,或者在node.js中的特定callback之外访问它?

//geoSpacialRepository.js var geoSpatialRepository = {}; var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/repository'); var Schema = mongoose.Schema; var LocationSchema = new Schema({ type: String, coordinates: [Number,Number] }); var Location = mongoose.model('locations', LocationSchema); var db = mongoose.connection; geoSpatialRepository.find = function(){ var query = Location.find({}, function(error, data){}); query.exec(function(err, data){ console.log("DATA ************************** "); console.log (JSON.stringify(data)); }); } exports.geoSpatialRepository = geoSpatialRepository; 

我写的地方console.log – >我想要这个callback的variablesdata ,因为我会调用这个函数geoSpatialRepository.find()在这个上下文之外(例如我的testing用例)。


// TestFile geoSpacilaRepository.spec.js

 var assert = require("assert"); var locationsRepository = require("../geoSpatialRepository.js").geoSpatialRepository; var chai = require("chai"), should = chai.should(), expect = chai.expect, assert = chai.assert; describe("finding locations from the database", function(){ //setup var data = { "type":"point", "coordinates":[20,20] }; before(function(){ locationsRepository.save(data); }); it("should find the data present in location repository",function(){ //call var actual = locationsRepository.find(); //assertion console.log("ACTUAL ********************"+(JSON.stringify(actual))) expect(actual).deep.equals(data); }); }); 

你可能不得不重新devise这样的find

 geoSpatialRepository.find = function(callBackFunction) { Location.find({}).exec(callBackFunction); } 

然后你需要从testing用例中调用它,像这样

 it("should find the data present in location repository", function() { //call locationsRepository.find(function(error, data) { console.log("ACTUAL ********************" + (JSON.stringify(actual))) //assertion expect(actual).deep.equals(data); }); }); 

现在,你作为parameter passing的函数将会得到实际的data 。 您可以比较该function中的dataactual值。