ReferenceError:未定义bookshelf

时间:2017-04-01 00:46:23

标签: javascript mysql webpack karma-jasmine bookshelf.js

我使用karma-jasmine,webpact运行单元测试。 我试图使用bookshelf在mysql数据库中插入一条记录。 我收到以下错误消息:

ReferenceError:未定义bookshelf         在module.exports.addCategoryWithProducts(app_serv / order / test / order.util.spec.js:94215:2)         在对象。 (app_serv /订单/测试/ order.util.spec.js:94059:3)         在ContextKarma.loaded(http://localhost:9876/context.js:151:12)     TypeError:无法读取未定义的属性'then'         在对象。 (app_serv /订单/测试/ order.util.spec.js:94074:4)

TypeError:_this.driver.createConnection不是函数

我的代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#Modal1">Modal 1</a> 
<a href="#Modal2">Modal 2</a> 
<a href="#Modal3">Modal 3</a> 
<div id="Modal"> 
  <div>
    <input type="text" id="textvalue"> 
  </div> 
  <button>submit</button>
</div>

单位测试代码:

var knex = require('knex')({
  client: 'mysql',
  connection: {
    host     : 'localhost',
    user     : 'user1',
    password : 'toto',
    database : 'totoDb',
    charset  : 'utf8'
  }
});

module.exports = require('bookshelf')(knex);

module.exports.addCategoryWithProducts = function(categoryToAdd) {

  bookshelf.transaction(function(t) {
    var products = categoryToAdd.products;
    var tableProd = [];

    //if (!req.params.idCategory || req.params.idCategory ==0) {
    Category.forge({
      name: categoryToAdd.name,
      code: categoryToAdd.code,
      tax_percentage: categoryToAdd.tax_percentage,
      description: categoryToAdd.description
    })
      .save(null, { transacting: t })
      .then(function(category) {
        for (var i = 0; i < products.length; i++) {
          tableProd.push({
            barcode: products[ i ].barcode,
            cip_13: products[ i ].cip_13,
            category_id: category.id,
            quantity: products[ i ].quantity,
            retail_price: products[ i ].retail_price,
            description: products[ i ].description,
            name: products[ i ].name,
            inn: products[ i ].inn,
            kind: products[ i ].kind,
            comment: products[ i ].comment,
            status: products[ i ].status,
            critical_threshold: products[ i ].critical_threshold,
            max_threshold: products[ i ].max_threshold,
            date_end: products[ i ].date_end
          });
        }

        Products.forge(tableProd)
          .invokeThen('save', null, { transacting: t })
          .then(function(products) {


            //console.log('inside insert of collection '+ JSON.stringify({category : category.toJSON(), produits: products}))
            //res.json({error : false, data: {category : category.toJSON(), products: products}});

            t.commit();

            return Promise.resolve(category.related('products'));
          })
          .catch(function(err) {
            return Promise.reject(err.message);
            //console.log('Erreur dans  Products.forge: ' + err.message);
            res.status(500)
              .json({ error: true, code: err.code, message: err.message });
          })

      })
      .catch(function(err) {
        return Promise.reject(err.message)
        //console.log('Erreur dans  Products.forge: ' + err.message);
        //res.status(500).json({error: true, code : err.code, message: err.message});
      })
  });
}

在尝试了许多解决方案失败后,我决定寻求你的帮助。

1 个答案:

答案 0 :(得分:0)

目前还不完全清楚你的代码库是如何工作的,但是从TypeError: Cannot read property 'then' of undefined来看,你似乎没有正确地向单元测试返回一个承诺。

尝试更改

Products.forge(tableProd)
  .invokeThen('save', null, { transacting: t })
  .then(function(products) {

return Products.forge(tableProd)
  .invokeThen('save', null, { transacting: t })
  .then(function(products) {

您还可以简化承诺和交易处理:

  • 您无需明确调用t.commit(),因为如果承诺解析,它将由Bookshelf自动调用
  • 您通常不需要在另一个Promise中使用Promise。因此,return Promise.resolve(category.related('products'))代替return category.related('products')而不是return Promise.reject(err.message)而不仅仅是return err.message(但重新投掷会更好)