当前位置: 首页 > 工具软件 > Sails > 使用案例 >

Node 框架之sails

夏侯衡
2023-12-01

sails其实是内置的express,所以如果你之前使用的是express,那么你将很快的入门该框架,因为sails基本的语法同express相同,只不过sails集成了很多其他工具,使得我们开发更简单。 

今天我只是记录一下它的使用方法,方便日后查看。

1、全局安装:

cnpm install -g sails


2、创建项目:

sails new sails_shop

,选2
    或者:
        

sails new sails_shop --fast

,选2
        

cd sails_cqwu
cnpm install //注:安装依赖包


3、启动项目:

sails lift


4、使用自动路由:

修改config->blueprints.js->actions: true


5、创建路由控制:
 

sails generate controller users zhuce login logout//这个users有login、logout等功能


6、自定义路由:

config->routes.js

 

 '方式 请求名':{响应方式:'路由'} 注:方式省略表示ALL,action方式可简写为字符串
    '/': { view: 'index' },
    'GET /users': {action: 'users/logout'},
    也可:'GET /users': 'users/logout',
    '/users/login': { action: 'users/login' },
    'POST /users/zhuce': { view: 'users/zhuce' }


7、对主页模板进行渲染:config->routes.js
   

'/': function (req,res) {
      req.session.logined="bbbbb";
      res.view('index',{title:req.session.logined})
    },


8、主页渲染方式2
  在config->routes.js中修改根路由:
  形如:  '/': 'UsersController.index',
  在UsersController.js中添加主页路由:
  形如:
 

  index: async function (req, res) {
        res.view('index',{title:99});
    },


    
9、前台访问:http://localhost:1337
10、修改端口:config->local.js
 

   module.exports = {
      port:1338
    }


11、不使用默认布局:config->views.js
    layout: false
    某个模板不使用布局文件:
    res.view({layout:false});
12、使用自定义的布局文件:在路由或控制器的渲染中添加属性layout
   

 req.session.logined="bbbbb";
 res.view('index',{layout: 'layouts/manage',title:req.session.logined})


13、连接数据库(这里我连接的是mongodb)
 

  cnpm install sails-mysql --save --save-exact
    cnpm install sails-mongo --save //--save 把安装的模块写进package.json
  <!--config/datastores.js-->
  module.exports.datastores = {
    default: {
      adapter: 'sails-mysql',
      url: 'mysql://user:password@localhost:3306/my_db_name',
    },
    mongoDb: {
      adapter: 'sails-mongo',
      url: 'mongodb://root:@localhost:27017/shop'
    }
  };
  <!--config/models.js-->
    schema: true,//严格匹配数据表的模式
    migrate: 'alter',//允许sails修改表的结构
    attributes: {
        createdAt: { type: 'number', autoCreatedAt: true, },
        updatedAt: { type: 'number', autoUpdatedAt: true, },
        id: { type: 'number', autoIncrement: true, }
        //id: { type: 'string', columnName: '_id' } 注:mongodb使用

}
    //允许sails自动添加三个字段


14、创建model(根下)
 

sails generate model admin//创建表或集合


15、修改model文件
  打开Admin.js,添加形如下表属性或结构:
    attributes: {
      zh: {type: 'string', required: true},
      nc: {type: 'string', required: true},
      pwd: {type: 'string', required: true}
    }

  //详细设置参见:数据库表各字段属性设置.html
16、应用model,典型应用在控制器或数据操作模块下:
  添加:
    let rows=await Admin.create({zh: 'lcjtmp6@163.com1', nc: '六六六1', pwd: '6661'}).fetch();
    await//解决异步问题
    .fetch()//返回你刚插入的记录
    console.log(rows);
    return res.send('ok');
    自动接收数据并插入表中方式:
    let reg_info=req.allParams();
    console.log(reg_info);
    let row=await Manage.create(reg_info).fetch();


  添加多条数据:
      let data=[
        {zh: 'lcjtmp1@163.com1', nc: 'aaaa1', pwd: '6661'},
        {zh: 'lcjtmp2@163.com1', nc: 'bbbb1', pwd: '6661'},
        {zh: 'lcjtmp3@163.com1', nc: 'cccc1', pwd: '6661'}
      ];
      let rows=await Admin1.createEach(data).fetch();
      console.log(rows);
      return res.send('ok');

  查询:
    let rs = await Admin.find(查询条件);
    console.log(rs);
    return res.send('ok');
    条件设置见:https://sailsjs.com/documentation/concepts/models-and-orm/query-language

  更新:
    let rows=await Admin1.update({zh: 'lcjtmp6@163.com'}, {nc: '我是改过的', pwd: '333'}).fetch();
    console.log(rows);//返回一个数组,哪怕是一条数据,是被更新的数据
    return res.send('ok');

  删除:
    //删除对象中某个成员delete login_data.yzm
    let rows=await Admin1.destroy({id: 5}).fetch();
    console.log(rows);//返回一个数组,哪怕是一条数据,是被删除的那条数据
    return res.send('ok');

  分页:
    let rs = await Admin.find().skip(2).limit(1);
    console.log(rs);
    return res.send('ok');

  统计记录数:
    let rs = await Admin.count();
    console.log(rs);//返回数字
    return res.send('ok');

  排序:
    let rs = await Admin.find().sort('id desc');
    console.log(rs);
    return res.send('ok');

17、应用拦截器
  (1)在某个路由或操作中加入登录信息:如:req.session.userId={id:5,nc:'aaa'};
  注销的时候把这个session删掉
  (2)在api/policies/新建策略文件形如:isLoggedIn.js
   

module.exports = async function (req, res, proceed) {
      if (req.session.userId) {
        return proceed();
      }
      return res.redirect('/users/login');
    };


  (3)在config/policiesl.js文件中修改是否应用策略
    全局方式:

      module.exports.policies = {
        '*': 'isLoggedIn',
        'users/index': true,
        'users/login': true
      }


    控制器方式:
   

   module.exports.policies = {
        UserController: {
          '*': 'isLoggedIn',//把所有的页面都拦截了
          'delete': 'isAdmin',
          'login': true//允许l访问ogin
        }
      }


      注:一个操作要用多个策略用[],如:['isLoggedIn', 'isAdmin']
18、文件上传
 

 upload: function (req, res) {
    req.file('image').upload(function (err, files) {
      if (err)
        return res.serverError(err);
      let path=files[0].fd.split('\\');
      path=path[path.length-1];
      console.log(path);//获取的文件默认放在.tmp/uploads下,这个名字应存一份到数据库
      return res.json({
        message: files.length + ' file(s) uploaded successfully!',
        files: files
      });
    });
  }


  传到自定义文件夹:

    req.file('avatar').upload(
      {
        dirname: require('path').resolve(sails.config.appPath, 'assets/images')
      },
      function (err, files) {
        if (err)
          return res.serverError(err);
        let path=files[0].fd.split('\\');
        path=path[path.length-1];
        console.log(path);//获取的文件放在assets/images下,这个名字应存一份到数据库
        return res.json({message: uploadedFiles.length + ' file(s) uploaded successfully!'});
    });


18、同时应用多个数据源
    (1).config->datastores.js
       

 module.exports.datastores = {
            default: {
              adapter: 'sails-mysql',
              url: 'mysql://root:123@localhost:3306/cqwu',
            },
            mongoDb: {
              adapter: 'sails-mongo',
              url: 'mongodb://root:@localhost:27017/shop'
            }
        };


    (2).config->models.js
       

module.exports.models = {
          schema: false,//无模式,可支持多种数据源
          migrate: 'alter',//允许系统根据情况修改结构
          attributes: {
            // createdAt: { type: 'number', autoCreatedAt: true, },
            // updatedAt: { type: 'number', autoUpdatedAt: true, },
            id: {type: 'number', autoIncrement: true,},
            // id: { type: 'string', columnName: '_id' }
          },
          dataEncryptionKeys: {
            default: 'Yinwzamuxr9wTGiSTc7Eox31f8idirOavmpaB4UfycU='
          },
          cascadeOnDestroy: true
        };


    (3).api->models->UserTabe.js //userTable为表或集合名称
        使用默认适配器default:
       

 module.exports = {
            attributes: {
              zh: {type: 'string', required: true},
              nc: {type: 'string', required: true},
              pwd: {type: 'string', required: true}
            }
        };


        使用mongoDb适配器:
       

 module.exports = {
            datastore: 'mongoDb',
            attributes: {
              id: {type: 'string', columnName: '_id'},
              zh: {type: 'string', required: true},
              nc: {type: 'string', required: true},
              pwd: {type: 'string', required: true}
            },
        };

mongodb可以自动创建数据库,但是mysql数据库不能自动创建,需要手动创建数据库


 

 类似资料: