2017-09-23 76 views
0

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

我试过如下:

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

您拨打knex.insert()返回承诺。您需要在promise chain中包含此承诺,方法是将其返回到您传递给then方法的处理程序中。通过在then处理程序中返回一个承诺,您就可以有效地告诉它等待答应解决。由于您没有任何返回(具体来说,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) 
    }); 
};