Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Knex.js查询数据库的函数返回未定义_Javascript_Node.js - Fatal编程技术网

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

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

我有一个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;
        });
}
承诺让您更容易地使用异步代码。 当使用
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引擎实现与主线程并行运行它们,但以透明的方式运行——您不能访问其他线程,您可以假装它们不存在。这就是为什么代码并不总是按照您编写的顺序运行。