2015-07-06 6 views
2

Я новичок в Sails и не знаю точно, где поставить инициализацию объекта уникальным во всем приложении. После прочтения документов я предположил, что могу иметь его в глобальном объекте sails, но не уверен, что это лучшее место.Лучшее место для установки инициализации в SailsJS

Я использую новый Appcelerator ArrowDB для хранения моих пользователей и объектов. Документы говорят о объявлении соответствующих варов и использовании его с помощью APP_KEY.

var ArrowDB = require('arrowdb'), 
    arrowDBApp = new ArrowDB('<App Key>'); 
function login(req, res) { 
    var data = { 
     login: req.body.username, 
     password: req.body.password, 
     // the req and res parameters are optional 
     req: req, 
     res: res 
    }; 
    arrowDBApp.usersLogin(data, function(err, result) { 
     if (err) { 
      console.error("Login error:" + (err.message || result.reason)); 
     } else { 
      console.log("Login successful!"); 
      console.log("UserInfo: " + JSON.stringify(result.body.response.users[0])); 
     } 
    }); 
} 

Но мне нужно будет использовать постоянно, что arrowDBApp вар создавать, обновлять, удалять объекты в базе данных, так что я думаю, что лучший способ, чтобы инициализировать его в исходном сценарии app.js и обмениваться через приложение.

Я попробовал это, но я не смог его сохранить в файле sails var, кажется, что этот var не доступен (или теряет его конфигурацию) до тех пор, пока не будет выполнен sails.lift().

Этот код (app.js файл) ничего не показывает в консоли:

// Ensure we're in the project directory, so relative paths work as expected 
// no matter where we actually lift from. 
process.chdir(__dirname); 

// Ensure a "sails" can be located: 
(function() { 
    var sails; 
    try { 
    sails = require('sails'); 
    } catch (e) { 
    console.error('To run an app using `node app.js`, you usually need to have a version of `sails` installed in the same directory as your app.'); 
    console.error('To do that, run `npm install sails`'); 
    console.error(''); 
    console.error('Alternatively, if you have sails installed globally (i.e. you did `npm install -g sails`), you can use `sails lift`.'); 
    console.error('When you run `sails lift`, your app will still use a local `./node_modules/sails` dependency if it exists,'); 
    console.error('but if it doesn\'t, the app will run with the global sails instead!'); 
    return; 
    } 

    // Try to get `rc` dependency 
    var rc; 
    try { 
    rc = require('rc'); 
    } catch (e0) { 
    try { 
     rc = require('sails/node_modules/rc'); 
    } catch (e1) { 
     console.error('Could not find dependency: `rc`.'); 
     console.error('Your `.sailsrc` file(s) will be ignored.'); 
     console.error('To resolve this, run:'); 
     console.error('npm install rc --save'); 
     rc = function() { return {}; }; 
    } 
    } 

    // My own code 
    var APP_KEY = 'mykey'; 
    var ArrowDB = require('arrowdb'); 
    sails.arrowDBApp = new ArrowDB(APP_KEY); 
    console.log("Hi" + JSON.stringify(sails)); 

    // Start server 
    sails.lift(rc('sails')); 
    console.log("Finish"); 
})(); 

Нет "HI" и не "Отделка" печатаются. Если я попытаюсь использовать sails.arrowDBApp в другом контроллере, он не определен.

Подсказки приветствуются.

ответ

2
  1. Используйте config/bootstrap.js, чтобы инициализировать что-то, прежде чем паруса подняли. Иногда, если мы хотим что-то поместить в переменную global, этот подход хорош в использовании, например define/override native Promise с Bluebird Promise.
  2. Используйте метод api/services, чтобы использовать некоторые методы, которые вы будете регулярно использовать в своем коде (контроллеры, модели и т. Д.), Например Mail Service, которые обрабатывают отправку электронной почты в вашем приложении.
  3. Используйте конфигурацию в папке config, чтобы предопределить что-то на sails.config[something]. Это может быть объект, функция или что-то другое, чтобы стать настраиваемым, например, добавить ключ API Twitter для использования API Twitter REST.

Чтобы достичь желаемого, я попытаюсь использовать сервис и bootstrap.js. Попробуйте этот пример.

  1. Создать файл службы в api/services/ArrowDBService.js
  2. Put с этим кодом:

    var ArrowDB = require('arrowdb'), 
        arrowDBApp = new ArrowDB('<App Key>'); 
    
    module.exports = { 
        arrowDBApp : arrowDBApp, 
        login  : function (req, res) { 
         var data = { 
          login: req.body.username, 
          password: req.body.password, 
          // the req and res parameters are optional 
          req: req, 
          res: res 
         }; 
         arrowDBApp.usersLogin(data, function(err, result) { 
          if (err) { 
           console.error("Login error:" + (err.message || result.reason)); 
          } else { 
           console.log("Login successful!"); 
           console.log("UserInfo: " + JSON.stringify(result.body.response.users[0])); 
          } 
         }); 
        } 
    }; 
    

Теперь вы можете использовать его sails.services.arrowdbservice.login(req,res) или просто ArrowDBService.login(req,res) (уведомление о случае чувствительной вещи). Поскольку я не знаю о ArrowDB, вы можете самостоятельно изучить метод login, который предоставляет ваш пример.

+0

Спасибо @ Andi. С вашей стороны, строка 'arrowDBApp = new ArrowDB ('');' будет выполняться каждый раз? То, что я ищу, это выполнить эту строку только один раз (например, Singleton) и иметь 'arrowDBApp' как var, доступный для всех контроллеров, для последующего выполнения' arrowDBApp.usersCreate() ',' arrowDBApp.usersUpdate() ', и т. д. – Eagle

+0

AFAIK It's singleton. –

+0

Я думаю, что этот способ не подходит для моих целей, потому что я ищу «shared» 'arrowDBApp' для использования в других контроллерах, и таким образом я разделяю функции напрямую (это не то, что я хочу) – Eagle

3

Не рекомендуется изменять app.js, если вам действительно не нужно.

Обычное пространство для сохранения всех сведений о конфигурации (например, APP_KEY) находится в каталоге config в корне вашего проекта.

Одноразовые инициализации (например, инициализация ArrowDB) могут быть добавлены к config/bootstrap.js.

Update

В конфигурации/arrowdb.js (вам нужно создать этот файл самостоятельно):

module.exports.arrowdb = { 
    APP_KEY: 'yourappkey', 
    ArrowDBApp: null 
}; 

В конфигурации/bootstrap.js:

var ArrowDB = require('arrowdb'); 

module.exports.bootstrap = function(next){ 
    sails.config.arrowdb['ArrowDBApp'] = new ArrowDB(sails.config.arrowdb['APP_KEY']); 
    next(); // Don't forget to add this 
}; 

В вашей контроллер:

'task': function(req, res, next) { 
    sails.config.arrowdb['ArrowDBApp'].usersLogin(...); 
    // and so on. 
    // You could also add something like 
    // var ADB = sails.config.arrowdb['ArrowDBApp']; 
    // at the top in case you need to use it on and on. 
} 
+0

Спасибо. Если я добавлю инициализацию arrowDB в bootstrap, как я могу использовать позже в другом контроллере. Например. в 'usersController.js' Мне нужно вызвать' create' в форме 'arrowDBApp.usersCreate()' – Eagle

+0

'require' кэшируется, а' arrowDBApp = new ArrowDB (''); 'будет выполняться только один раз? Если да, то это будет то, что я ищу. – Eagle

+0

Я удалил предыдущий комментарий, потому что он был в неправильном контексте, и я думал о 'arrowdb' вместо' arrowDBApp'. 'arrowDBApp = new ArrowDB ('');' будет выполняться только один раз, если он находится в bootstrap.js. Чтобы получить доступ к 'arrowDBApp' глобально, я бы предложил добавить его в файл конфигурации, содержащий' APP_KEY'. Таким образом, он будет доступен повсюду и будет инициализирован только один раз. – galactocalypse

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