2017-09-23 73 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) 
    }); 
};