在SailsJS中设置初始化的更好位置

Better place to setup an initialisation in SailsJS

本文关键字:更好 位置 初始化 设置 SailsJS      更新时间:2023-09-26

我是Sails的新手,不知道在所有应用程序中,对象的初始化应该是唯一的。在阅读了这些文档后,我认为我可以将其放在全局sails对象中,但不确定是否是更好的位置。

我正在使用新的Appcelerator ArrowDB来存储我的用户和对象。文档讨论声明适当的vars并使用它,使用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 var来创建、更新、删除数据库中的对象,所以我认为最好的方法是在启动脚本app.js中初始化它,并在整个应用程序中共享。

我试过了,但无法将其存储在sails变量中,在执行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"answers"Finish"。如果我尝试在另一个控制器中使用sails.arrowDBApp,它是未定义的。

欢迎提供提示。

除非确实需要,否则不建议修改app.js

保存所有配置信息(例如APP_KEY(的常用空间位于项目根目录的config目录中。

一次性初始化(例如ArrowDB初始化(可以添加到config/bootstrap.js.

更新

在config/arrowdb.js中(您需要自己创建此文件(:

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

在config/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.
}
  1. 使用config/bootstrap.js在帆升起之前初始化一些东西。有时,如果我们想把一些东西放在global变量中,这种方法很好用,比如用Bluebird Promise定义/覆盖本地Promise
  2. 使用api/services可以在代码(控制器、模型等(中放置一些方法或其他您将经常使用的东西,如Mail Service,用于处理应用程序中的电子邮件发送
  3. 使用config文件夹中的config在sails.config[something]中预定义一些内容。它可以是一个对象、函数或任何可以配置的东西,比如把Twitterneneneba API Key放在使用TwitterREST API上

为了实现你想要的,我将尝试使用service和bootstrap.js。试试这个例子。

  1. api/services/ArrowDBService.js创建服务文件
  2. 用这个代码放:

    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方法。