Javascript 使用Knex.js查询数据库的函数返回未定义
我有一个Node.js服务器,我将使用它来处理网站。我正在尝试制作一个与数据库交互的API。我必须使用Knex.js来管理数据库 Knex的初始化和数据库及其单个表的创建(目前)进展顺利。这里我要做的是一个函数,给定一个id作为参数,它将查找相应的行并返回它 我在这里创建表:Javascript 使用Knex.js查询数据库的函数返回未定义,javascript,node.js,Javascript,Node.js,我有一个Node.js服务器,我将使用它来处理网站。我正在尝试制作一个与数据库交互的API。我必须使用Knex.js来管理数据库 Knex的初始化和数据库及其单个表的创建(目前)进展顺利。这里我要做的是一个函数,给定一个id作为参数,它将查找相应的行并返回它 我在这里创建表: // create tables in the database function createDoctorsTable() { jcdb.schema.hasTable("doctors").then(funct
// create tables in the database
function createDoctorsTable() {
jcdb.schema.hasTable("doctors").then(function (exists) {
if (!exists) {
jcdb.schema.createTable("doctors", function (table) {
table.integer("id");
table.string("name").notNullable();
table.string("surname").notNullable();
table.string("presentation");
table.string("professional_story");
table.string("photo");
table.string("mail");
table.string("phone");
}).then(function () {
return Promise.all(
_.map(doctorsDBfile, function (v) {
return jcdb("doctors").insert(v);
})
);
});
}
else {
return true;
}
});
}
这就是我要做的功能
function getDoctorById(id) {
var result;
jcdb("doctors").where("id", id)
.then(function(query) {
result = JSON.stringify(query);
});
return result;
}
然后我给我需要的一切打电话:
app.set("port", serverPort);
init_jcdb();
createDoctorsTable();
/* Start the server on port 3000 */
app.listen(serverPort, function() {
console.log(`Your app is ready at port ${serverPort}`);
console.log(getDoctorById(2));
});
对getDoctorById()的调用返回未定义!如果我将console.log()放在函数中,它会正确地打印行。
我做错了什么
PS:我在js是个十足的傻瓜,就在昨天,我第一次看到它
function getDoctorById(id) {
var result;
jcdb("doctors").where("id", id)
.then(function(query) {
result = JSON.stringify(query);
});
return result;
}
请尝试:
function getDoctorById(id) {
return jcdb("doctors").where("id", id)
.then(function(query) {
var result = JSON.stringify(query);
return result;
});
}
承诺让您更容易地使用异步代码。
当使用then
时,实际上是在调用回调函数,将链中先前承诺的结果作为回调函数的参数
但是为了这样做,您必须从promise的回调中返回一个值(您传递给然后
的函数),这是回调参数中的值
并且还返回承诺返回函数本身(在本例中为jcdb
),因为记住,只有承诺才有then
按照同样的逻辑,,
您不能像这里这样执行console.log()
函数:
console.log(getDoctorById(2));
因为,请记住,函数返回的是一个承诺
,而不是一个值。它间接返回值作为回调函数的参数。这给了我们:
getDoctorById(2).then(function(result) {
console.log("result:", result);
})
最后一件事,
您的第一个函数,createDoctorsTable()
,也是异步的;在某些情况下,它可能在getDoctorById()之前执行
首先,让我们从您的createDoctorsTable()
返回一个承诺,这样我们就可以让getDoctorById
严格按照它运行:
function createDoctorsTable() {
return jcdb.schema.hasTable("doctors").then(function (exists) {
.......
(注意:我只添加了return语句,其余看起来不错)
然后更改你的应用程序。听一听
,使你的最终代码看起来像这样(假设init_jcdb()
返回一个承诺):
编写此代码有很多变体
我建议您阅读更多关于JavaScript异步模型的内容,以及JavaScript中的承诺
请尝试:
function getDoctorById(id) {
return jcdb("doctors").where("id", id)
.then(function(query) {
var result = JSON.stringify(query);
return result;
});
}
承诺让您更容易地使用异步代码。
当使用then
时,实际上是在调用回调函数,将链中先前承诺的结果作为回调函数的参数
但是为了这样做,您必须从promise的回调中返回一个值(您传递给然后
的函数),这是回调参数中的值
并且还返回承诺返回函数本身(在本例中为jcdb
),因为记住,只有承诺才有then
按照同样的逻辑,,
您不能像这里这样执行console.log()
函数:
console.log(getDoctorById(2));
因为,请记住,函数返回的是一个承诺
,而不是一个值。它间接返回值作为回调函数的参数。这给了我们:
getDoctorById(2).then(function(result) {
console.log("result:", result);
})
最后一件事,
您的第一个函数,createDoctorsTable()
,也是异步的;在某些情况下,它可能在getDoctorById()之前执行
首先,让我们从您的createDoctorsTable()
返回一个承诺,这样我们就可以让getDoctorById
严格按照它运行:
function createDoctorsTable() {
return jcdb.schema.hasTable("doctors").then(function (exists) {
.......
(注意:我只添加了return语句,其余看起来不错)
然后更改你的应用程序。听一听
,使你的最终代码看起来像这样(假设init_jcdb()
返回一个承诺):
编写此代码有很多变体
我建议您阅读更多关于JavaScript异步模型的内容,以及JavaScript中的承诺。我不能让函数直接返回值吗?例如,在需要数据库中特定id值的http页面中,如何使用此函数?我认为返回一个值很容易管理。对于createDoctorTable(),我考虑了异步,并尝试将其作为后续调用,但没有太多成功啊哈无论如何非常感谢:)你不能这么做:)这是由于JavaScript的异步性质;JS只使用1个线程来运行它的同步代码,比如函数调用。异步代码,比如jcdb函数背后的代码,使用绑定到JS引擎实现,JS引擎实现与主线程并行运行它们,但以透明的方式运行——您不能访问其他线程,您可以假装它们不存在。这就是为什么代码不总是按照您编写的顺序运行。我不能让函数直接返回值吗?例如,在需要数据库中特定id值的http页面中,如何使用此函数?我认为返回一个值很容易管理。对于createDoctorTable(),我考虑了异步,并尝试将其作为后续调用,但没有太多成功啊哈无论如何非常感谢:)你不能这么做:)这是由于JavaScript的异步性质;JS只使用1个线程来运行它的同步代码,比如函数调用。异步代码,比如jcdb函数背后的代码,使用绑定到JS引擎实现,JS引擎实现与主线程并行运行它们,但以透明的方式运行——您不能访问其他线程,您可以假装它们不存在。这就是为什么代码并不总是按照您编写的顺序运行。