2016-11-16 2 views
0

Возможно, мне не хватает чего-то основного, как это происходит.Javascript: Почему объект не получает инициализацию при новом вызове api, однако строковая переменная есть?

GET: example.com/users // предоставляет все данные

GET: example.com/users?status=1 // дает данные со статусом = 1

GET: example.com/users // это не работает дает те же данные, что и проницаемым условия API со статусом = 1

С третьим ударом self.whereObj не инициализирует пустой объект по умолчанию, вместо этого он принимает предыдущее значение {'status' = '1'}, однако self.page и self.limit принимает значение по умолчанию, если в строке запроса не указан параметр запроса.

example.com/users?limit=3 // принимает значение переопределения для 3 формы по умолчанию 5

example.com/users // self.limit принимает по умолчанию 5 и это работает отлично

Так что мой вопрос, почему self.limit (простая переменная строка) является инициализация однако self.whereObj нет?

var Bookshelf = require('../../dbconfig').bookshelf; 
Bookshelf.Collection = Bookshelf.Collection.extend({ 

    limit: 5, 
    page: 1, 
    whereObj: {} 

    myFetch: function (query_params,expectedWhereFields) { 
     var self = this; 
     var whereObj = self.whereObj ; // this is not initializing 
     // var whereObj = {}; this is initialising 
     var page = self.page; 
     var limit = self.limit; //this is not showing nay initialisation error 

     for (var x in query_params) { 
      if (expectedWhereFields.includes(x)) { 
       whereObj[x] = query_params[x]; 
      } 
      if (x === 'page') { 
       page = query_params[x]; 
      } 
      if (x === 'limit') { 
       limit = query_params[x]; 
      } 
     } 
     var offset = (page - 1) * limit; 

     function fetch() { 
      return self.constructor.forge() 
       .query({where: whereObj}) 
       .query(function (qb) { 
        qb.offset(offset).limit(limit); 
       }) 
       .then(function (collection) { 
        return collection; 
       }) 
       .catch(function (err) { 
        return err 
       }); 
     } 
     return new fetch(); 
    } 
}); 
module.exports = Bookshelf; 

ОБНОВЛЕННЫЕ

service.js

var Model = require('./../models/Users'); 
var express = require('express'); 

var listUsers = function (query_params, callback) { 
    var expectedWhereFields = ["type", "status", "name"]; 
    Model.Users 
     .forge() 
     .myFetch(query_params, expectedWhereFields)  
     .then(function (collection) { 
      return callback(null, collection); 
     }) 
     .catch(function (err) { 
      return callback(err, null); 
     }); 
}; 

module.exports = { 
    listUsers: listUsers 
}; 

модели/Users.js

var Bookshelf = require('../../dbconfig').bookshelf; 
var Base = require('./base'); 

// Users model 
var User = Bookshelf.Model.extend({ 
    tableName: 'user_table' 
}); 
var Users = Bookshelf.Collection.extend({ 
    model: User 
}); 

module.exports = { 
    User: User, 
    Users: Users 
}; 
+0

Является ли эта магистраль? –

+0

No Nodejs (экспресс). – atjoshi

+0

даже 'self.limit' не инициализируется, вы просто вызываете метод' myFetch', который не инициализирует свойства объекта. просто делайте это с помощью 'var whereObj = {};' –

ответ

1

Так что мой вопрос, почему self.limit (простая строковая переменная) инициализируется, однако self.whereObj нет?

Поскольку объекты являются ссылочными значениями. Когда вы устанавливаете var whereObj = self.whereObj;, оба относятся к одному и тому же объекту и при копировании параметров запроса в свойства объекта, которые вы эффективно записываете в свой экземпляр по умолчанию. Это не происходит с примитивными значениями, такими как строки - они не имеют изменяемых свойств.

Смежные вопросы