通过knex

时间:2017-09-23 16:36:56

标签: javascript knex.js

我想通过knex使用for look来插入数据,以创建一个插入数据的对象。

我尝试了以下内容:

const faker = require('faker');
const dataLength = 10
const obj = []

exports.seed = function (knex, Promise) {
  // Deletes ALL existing entries
  return knex('posts').del()
    .then(function () {
      //create entries
      for (var index = 0; index < dataLength; index++) {
        obj[index] = {
          title: faker.lorem.sentence(),
          description: faker.lorem.paragraph(),
          createdAt: faker.date.recent(),
          updatedAt: faker.date.recent(),
          deletedAt: faker.date.recent(),
          deleted: faker.random.boolean(),
          tags: faker.random.arrayElement(["tag1", "tag2", "tag3", "tag4"])
        }
        knex('posts').insert([,
          obj[index]
        ]);
      }
      // Inserts seed entries
      return 
    });
};

我的问题是没有数据保存到数据库。

有什么建议我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

您对knex.insert()的致电会退回承诺。您需要在promise chain中包含此承诺,方法是将其传递给传递给then方法的处理程序。通过在then处理程序中返回一个promise,您实际上是在告诉它等待 承诺解决。因为您没有返回任何内容(特别是undefined),您的种子函数会删除帖子,但不需要知道它必须在完成之前等待任何其他操作完成。

将来,如果您有多个承诺要返回,您可以使用Promise.all()返回所有承诺:

exports.seed = function (knex, Promise) {
  return knex('posts').del()
    .then(function () {
      return Promise.all([
        knex('bar').insert(),
        knex('foo').insert(),
      ])
    })
};

然后你的承诺链会在继续之前等待Promise.all()内的所有承诺解决。

但是,在这种特殊情况下,不需要多次调用knex.insert(),因为它可以接受一个对象数组而不是一个对象:

exports.seed = function (knex, Promise) {
  return knex('posts').del()
    .then(function () {
      const posts = []
      for (let index = 0; index < dataLength; index++) {
        posts.push({
          title: faker.lorem.sentence(),
          description: faker.lorem.paragraph(),
          createdAt: faker.date.recent(),
          updatedAt: faker.date.recent(),
          deletedAt: faker.date.recent(),
          deleted: faker.random.boolean(),
          tags: faker.random.arrayElement(["tag1", "tag2", "tag3", "tag4"])
        })
      }
      return knex('posts').insert(posts)
    });
};