javascript - Promise - 使用 async/await 函数将数据返回到常量

标签 javascript node.js knex.js

我试图理解 knex 并为其创建了以下示例服务层:

const config = require('../db/knexfile');
const env = 'development';
const knex = require('knex')(config[env]);

/**
 * Return all posts
 */
function getAllPosts() {
    return knex('posts').select().then(data => {
        return data
    })
}

/**
 * Create a post
 */
function create(title, description) {
    console.log("Titel: " + title + " Description: " + description)

    return knex('posts')
        .insert({
            title: title,
            description: description,
            deleted: true,
            createdAt: new Date(),
            updatedAt: new Date()
        }, 'id')
        .then(id => {
            console.log("Inserted post with id "+ id)            
            return id;
        })
        .catch((err) => console.log(err));
}

/**
 * find a post by id
 */
function findById(id) {
    try {
        return knex('posts').select().where('id', id).first().then(data => {
            return data
        })
    } catch (e) {
        console.log(e)
    }
}

module.exports = {
    create,
    getAllPosts,
    findById
}

我从另一个文件调用上述文件:

const service = require('./t5_0-serviceLayer')

async function main() {

    //prepare data
    //service.prepareData()

    //getAll
    service.getAllPosts().then(data => {
        console.log(JSON.stringify(data))
    })

    //create
    const id = service.create("Test post", "Test description")
    console.log("Post with " + id + ": " + service.findById(id))

    //get all Posts
    const res = service.getAllPosts()
    console.log("We have " + res.length  + " posts.")


}

main().then().catch(err => console.error(err))

我得到以下输出:

Titel: Test post Description: Test description
Post with undefined undefined
We have undefined posts.
[{"id":43,"title":"Et saepe qui occaecati unde nesciunt et.","description":"Sint commodi possimus sunt voluptatibus rerum. Incidunt mollitia accusantium ita
que nihil tempora. Qui veritatis ipsam expedita velit aut consequatur distinctio. Veritatis culpa labore rem ut a non perferendis.","deleted":false,"created
At":"2017-09-17T03:18:19.452Z","updatedAt":"2017-09-17T06:29:40.385Z","deletedAt":"2017-09-17T08:05:17.367Z"},{"id":44,"title":"Deserunt laborum reiciendis
magnam doloremque animi aspernatur sunt quod.","description":"Ea recusandae voluptas magni magni ipsum non dolorem iusto modi. Ipsum fuga inventore corporis
 qui. Qui voluptatum eaque nesciunt expedita sed ipsa vel dolor inventore. Quos praesentium dolorum aut et amet amet tempora sed et.","deleted":true,"create
dAt":"2017-09-16T22:23:51.956Z","updatedAt":"2017-09-17T13:46:44.679Z","deletedAt":"2017-09-17T11:09:14.936Z"},{"id":45,"title":"Quibusdam sunt qui beatae."
,"description":"Aut tempore totam. Nihil qui est rerum ut ipsum at autem sint. Pariatur tempore praesentium. Magnam doloremque ipsam. Nihil nesciunt odit bl
anditiis.","deleted":false,"createdAt":"2017-09-16T20:58:03.889Z","updatedAt":"2017-09-17T11:19:06.696Z","deletedAt":"2017-09-17T03:42:25.541Z"},{"id":46,"t
itle":"Test post","description":"Test description","deleted":true,"createdAt":"2017-09-17T17:34:12.882Z","updatedAt":"2017-09-17T17:34:12.882Z","deletedAt":
null},{"id":47,"title":"Test post","description":"Test description","deleted":true,"createdAt":"2017-09-17T17:35:54.056Z","updatedAt":"2017-09-17T17:35:54.0
56Z","deletedAt":null},{"id":48,"title":"Test post","description":"Test description","deleted":true,"createdAt":"2017-09-17T17:36:28.801Z","updatedAt":"2017
-09-17T17:36:28.801Z","deletedAt":null}]
Unhandled rejection Error: Undefined binding(s) detected when compiling FIRST query: select * from "posts" where "id" = ? limit ?
    at QueryCompiler_PG.toSQL (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\knex\lib\query\compiler.js:131:13)
    at Builder.toSQL (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\knex\lib\query\builder.js:115:44)
    at C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\knex\lib\runner.js:56:32
    at tryCatcher (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\util.js:16:23)
    at C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\using.js:185:26
    at tryCatcher (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\util.js:16:23)
    at Promise._settlePromiseFromHandler (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:512:31)
    at Promise._settlePromise (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:569:18)
    at Promise._settlePromise0 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:614:10)
    at Promise._settlePromises (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:693:18)
    at Promise._fulfill (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:638:18)
    at PromiseArray._resolve (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise_array.js:126:19)
    at PromiseArray._promiseFulfilled (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise_array.js:144:14)
    at Promise._settlePromise (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:574:26)
    at Promise._settlePromise0 (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:614:10)
    at Promise._settlePromises (C:\Users\user\Desktop\Coding Projects\learning_knex\node_modules\bluebird\js\release\promise.js:693:18)

Inserted post with id 49

我的服务层目前遇到以下问题

  • 当我调用 const id = service.create("Test post", "Test description") 时,我没有得到所创建帖子的 ID
  • 当我调用 service.getAllPosts() 时,我没有得到帖子长度

有什么建议我做错了什么吗?

最佳答案

看起来您正在 main 函数上使用 async 。您需要在 main 中的每个 promise 返回函数调用之前放置 await。我假设 service.create 返回一个 promise ?如果是这样,那么使用类似这样的东西:

const id = await service.create("Test post", "Test description")

service.getAllPosts 也是如此:

const res = await service.getAllPosts()

@trincot 的答案并没有错......它只是忽略了您正在尝试使用 async 的事实,这是现代 Node 版本上可用的语言功能。请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

请记住,您可能希望在 try/catch block 中执行此操作以处理任何意外错误。

关于javascript - Promise - 使用 async/await 函数将数据返回到常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46267047/

相关文章:

javascript - 完成 knex 交易后如何执行操作?

javascript - 单击带有 href 属性的链接并执行 Javascript 函数

javascript - 如何在没有特定标签的情况下搜索资源

javascript - cytoscape.js 的外部 json 文件调用期间出现意外标记] 错误

node.js - 错误消息 : "event is not defined" in lambda function nodejs

node.js - 为什么当我使用 sequelize 生成模型时,它的结构与包含类而不是 const 的其他模型的结构不同?

jquery - nodejs 或 envjs - 动态 jquery tmpl

javascript - 解析转义的 javascript

node.js - 如何在 knex 模式中指定浮点精度?

mysql - 克尼克斯/SQL : Merge one to many join in one object