如何从 knex 插入物中取回 ID?

How do I get the ID back from a knex insert?

我将下面的代码用作 graphql 解析器的一部分。我正在尝试 return 从 knex 查询中返回 id,但是 console.log(pageid) 正在返回,因为 null.But 而 console.log(id) 不是;

resolve(parentValue, { id, page_name, page_type, page_category }) {
    var pageid = null;
    const pageInsert = knex
        .insert({ id, page_name, page_type, page_category })
        .returning('id')
        .into('page')
        .then(function (id) {
            console.log(id);
            pageid = id;
        });

    console.log(pageid);
    console.log(pageInsert);

    return pageInsert;
}

我将在 javascript 中注释这些行的执行顺序:

resolve(parentValue, { id, page_name, page_type, page_category }) {
    var pageid = null;         // -- 1 page id is null
    const pageInsert = knex
        .insert({ id, page_name, page_type, page_category })
        .returning('id')
        .into('page')
        .then(function (id) {
            console.log(id); // -- 6 printing result just file
            pageid = id;     // -- 7 storing result to variable that is never used
        }); // -- 2 created query builder and triggered it's execution

    console.log(pageid);     // -- 3 pageid is still null
    console.log(pageInsert); // -- 4 page insert is a promise which is returned

    return pageInsert;       // -- 5
}

所以你在 .then 中取回它,但随后你将它存储到局部变量 pageid 并且以后再也不会使用它。

你可能应该这样做:

resolve(parentValue, { id, page_name, page_type, page_category }) {
    return knex
        .insert({ id, page_name, page_type, page_category })
        .returning('id')
        .into('page')
}

在来电方:

resolve(...).then(id => console.log(id))

or

const id = await resolve(...);