gpt4 book ai didi

javascript - 使用 Knex.js 查询数据库的函数返回未定义

转载 作者:行者123 更新时间:2023-12-01 03:26:16 24 4
gpt4 key购买 nike

我有一个 Node.js 服务器,我将用它来处理网站。我正在尝试创建一个 API 来与数据库交互。我必须使用 Knex.js 来管理数据库。

Knex 的初始化以及数据库及其单个表的创建(目前)进展顺利。我在这里尝试做的是一个函数,给定一个 id 作为参数,它将查找相应的行并返回它。

这里我创建了表:

// 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;
});
}

Promise 让您可以更轻松地使用异步代码。使用 then 时,您实际上是在调用回调函数,并将链中前一个 Promise 的结果作为回调函数的参数。

但是为了做到这一点,您必须从 Promise 的回调中返回一个值(您传递给 then 的函数),该值将进入回调的参数中,

并且还返回promise-returning-function本身(在本例中为jcdb) - 因为记住,只有promise才有then

遵循同样的逻辑,你不能像这里那样 console.log() 函数:

console.log(getDoctorById(2));

因为,请记住,该函数返回一个promise,而不是一个值。它间接返回值作为其回调函数的参数。这给了我们:

getDoctorById(2).then(function(result) {
console.log("result:", result);
})

最后一件事,您的第一个函数 createDoctorsTable() 也是异步的;在某些情况下,它可能会在 getDoctorById() 之前执行。

首先,让我们从 createDoctorsTable() 返回一个 Promise,以便我们可以让 getDoctorById 在它之后严格运行:

function createDoctorsTable() {
return jcdb.schema.hasTable("doctors").then(function (exists) {
.......

(注意:我只添加了 return 语句,其余的看起来不错)。

然后更改您的app.listen,使您的最终代码看起来像这样(假设init_jcdb()返回一个 promise ):

// create tables in the database
function createDoctorsTable() {
return 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) {
return jcdb("doctors").where("id", id)
.then(function(query) {
var result = JSON.stringify(query);
return result;
});
}


app.set("port", serverPort);

init_jcdb()
.then(function() {
return createDoctorsTable();
})
.then(function() {
getDoctorById(2).then(function(result) {
console.log("result:", result);
})
})
.then(function() {
/* Start the server on port 3000 */
app.listen(serverPort, function() {
console.log(`Your app is ready at port ${serverPort}`);
}
});
});

编写此代码有很多变体。

我建议您阅读更多有关 JavaScript 异步模型和 JavaScript 中的 Promise 的内容。

关于javascript - 使用 Knex.js 查询数据库的函数返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44809308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com