【问题标题】:Insert into database using knex使用 knex 插入数据库
【发布时间】:2017-09-10 17:04:52
【问题描述】:

我正在使用knex 0.13.0,我正在尝试使用以下函数插入到 mysql 数据库中:

async function create(title, description) {
    //trim spaces
    console.log("title: " + title)
    console.log("description: " + description)
    title = title.trim()
    description = description.trim()
    createdAt = _.now()
    deleted = false
    console.log("Create Post: " + title + " " + description + " " + createdAt + " " + deleted)

    if (title.length < 1 || title.length > 255) throw new Error('Title is not valid.')
    if (description.length < 1) throw new Error('Description is not valid.')

    try {
        await knex('posts').insert({
            title,
            description,
            createdAt,
            deleted
        })
        console.log("added to db")
        return true;
    } catch (e) {
        return "An error occured: " + e;
    }
}

Create Post: Title Description 1505062847788 false 的最后一个控制台输出显示正确,但没有任何反应,即使在等待之后

  • 我猜这是函数的异步部分,但同时还能做什么?
  • 在使用 knex 时是否有标准的方法来创建条目?

感谢您的回复!

【问题讨论】:

    标签: javascript mysql knex.js


    【解决方案1】:

    我正在使用节点 6,因此目前无法测试“等待”(在节点 7 中),但从 this post 看来,您应该将等待响应分配给变量。喜欢:

    ...        
    var awResponse; // new variable
    try {
        awResponse = await knex('posts').insert({
    ...
    

    详细说明:

    async function create(title, description) {
        //trim spaces
        console.log("title: " + title)
        console.log("description: " + description)
        title = title.trim()
        description = description.trim()
        createdAt = _.now()
        deleted = false
        console.log("Create Post: " + title + " " + description + " " + createdAt + " " + deleted)
    
        if (title.length < 1 || title.length > 255) throw new Error('Title is not valid.')
        if (description.length < 1) throw new Error('Description is not valid.')
    
        var awResponse; // new variable
        try {
            awResponse = await knex('posts').insert({
                title,
                description,
                createdAt,
                deleted
            })
            console.log("added to db")
            return true;
        } catch (e) {
            return "An error occured: " + e;
        }
    }
    

    您所拥有的应该可以正常工作,但我一直在做的(作为您的替代方案)只是直接使用承诺,并通常如下构建我的数据访问函数:

    function create(title, description) {
        return Promise.resolve().then(function () {
            // This first section is for preping the record for insert.
            //
            //trim spaces
            console.log("title: " + title)
            console.log("description: " + description)
            title = title.trim()
            description = description.trim()
            // createdAt = _.now()  // I have a error that "_" is not valid
            createdAt = (new Date()).toISOString();
            deleted = false
            console.log("Create Post: " + title + " " + description + " " + createdAt + " " + deleted)
    
            if (title.length < 1 || title.length > 255) throw new Error('Title is not valid.')
            if (description.length < 1) throw new Error('Description is not valid.')
            return { "title": title,
                     "description": description,
                     "createdAt": createdAt,
                    "deleted": deleted };
        })
        .then(function (recordToInsert) {
            // This second section is for the insert.
            //
            console.log("Part #2");
            return knex('posts').insert(recordToInsert)
            .on('query-error', function(ex, obj) {
                // console.log("KNEX query-error ex:", ex);
                // console.log("KNEX query-error obj:", obj);
                // Below logs db errors into my custom encapsulation of winston logging.
                //       ... and the .catch further down will still be executed.
                log.logMsg('error', "DBA.INS88", "KNEX create.on.query-error", {"fnc": "create", "obj":obj, "ex":ex} );
            })
        })
        .then(function (insertResult) {
            // This third section is for post-processing the result (if needed).
            //
            console.log("Part #3 added to db :", insertResult);
            return insertResult; // returns id value from insert;
        })
        .catch(function (e) {
            // I omit this .catch to let the caller know about and handle the exceptions
            console.log( "An error occured: " + e);
        });
    };
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      相关资源
      最近更新 更多