我正在尝试通过电子邮件搜索我的本地数据库中的用户,但是当我尝试通过导入引用从不同的js文件执行此操作的函数时,我得到未定义的结果。我在Stack上搜索了一下我遇到的这个问题,听说过一些被称为回调的东西,这是我需要实现的吗?如果是这样,你能指点我一个例子吗?
提前致谢!
这是我导出的代码(db.js文件):
var neo4j = require('neo4j-driver').v1;
var driver = neo4j.driver("bolt://localhost:7687", neo4j.auth.basic("neo4j", "neo4j"));
var session = driver.session();
exports.findEmail = (email) => {
// console.log('hi');
session
.run("MATCH (a:Person) WHERE a.email = {email} RETURN a.name AS name, a.email AS email, a.location AS location", {
email: email
})
.then((result) => {
let result_string = '';
result.records.forEach((record) => {
console.log(record._fields);
result_string += record._fields + ' ';
});
return result_string;
})
.catch((e) => {
return ('error : ' + JSON.stringify(e));
})
}
这是我的代码调用export:(test.js)
var tester = require('./db.js');
let temp = tester.findEmail("testemail@yahoo.com");
console.log(temp);
答案 0 :(得分:0)
问题是JS是异步的,你使用它是因为它是同步代码。
你可以尝试这个,应该工作:
var neo4j = require('neo4j-driver').v1;
var driver = neo4j.driver("bolt://localhost:7687", neo4j.auth.basic("neo4j", "neo4j"));
var session = driver.session();
const findEmail = (email, callback) => {
console.log('hi :', email);
session
.run("MATCH (a:Person) WHERE a.email = {email} RETURN a.name AS name, a.email AS email, a.location AS location", {
email: email
})
.then((result) => {
let result_string = '';
result.records.forEach((record) => {
console.log(record._fields);
result_string += record._fields + ' ';
});
return callback(null, result_string);
})
.catch((e) => {
return callback('error : ' + JSON.stringify(e)));
})
}
module.exports = {
findEmail
};
然后在test.js:
var tester = require('./db');
tester.findEmail("testemail@yahoo.com", (err, temp) => {
if (err) return console.error(err);
console.log(temp);
} );
这背后的想法是db文件中的所有流都是异步的。
因此,为了捕获结果,您需要传递函数callback
,该函数将在异步流程完成时触发。