• NodeJs学习笔记(三)


         最近在用sails框架写移动后台,马上就过年了,打算总结一下。

     
    1、资源
         node官方网站: www.nodejs.org
         sails官方网站:www.sailsjs.org
         查找资源: www.github.com,上面有大部分的npm包,可以选择你需要的资源包     
    2、开发工具
    •  WebStorm:http://www.jetbrains.com/,这家公司非常出名,其Java开发工具首屈一指,并且Android Studio就是以其Java IDE作为底层支撑。它的代码提示非常棒,可惜是收费的,需要花钱购买。
    • NetBeans: www.netbeans.org,这个IDE我用的较多,它是免费的,但是它对node本身并不提供支持,它只是支持JS语法,虽然有一个NodeJS插件,但是没多大用处,只是在IDE中执行命令而已,并且它有个很不好的现象,就是会不停的扫描外部更改,而sails在运行时会在根目录下的.tmp目录创建临时文件,不知道是不是这个原因,Netbeans在写NodeJS程序时会突然变慢,所以我现在也不怎么喜欢用这个工具了。当然Netbeans在写Java程序和PHP程序时是相当棒的,比如我使用的Laravel框架,在Netbeans中调试起来挺方便的。
    • Aptanata Studio 3:http://www.aptana.com/ ,这个工具是用开脚本语言,如PHP、Python、Ruby的,也支持js语法,不过我没有怎么使用,其PHP调试功能挺强大的。
    • Nodeclipse:http://www.nodeclipse.org/,这是个基于Eclipse的插件,要使用起来并不容易,我在windows上用了一下,本来希望提示我自己写的一些函数,但是直接就没反应了,后来就不用了,不知道为什么它名气那么大。
    • NTVS:https://nodejstools.codeplex.com/,这是个Visual Studio的插件,功能还不错,可以代码提示,支持免费的Visual Studio社区版以及收费版,不过社区版对版本管理支持的不好,需要在IDE外使用版本管理工具。它也有一些不如人意的地方,比如其格式化代码的方式很奇怪,有的代码能格式化,有的不能,但总体来说,要好一些,打算下一阶段用这个工具。
    • Sublime:http://www.sublimetext.com/,sublime是个很强大的编辑器,可以使用一些插件来进行代码提示,当然无法提示自己写的函数,但是对于一般的应用来说也够了,因为我用netbeans的时候,也无法提示自有函数,也无法调试。而且它比较轻量级,比较节省资源。只不过它需要收费,虽然不破解也能使用,但是让人不怎么舒服。
    • Nodepad++:http://notepad-plus-plus.org/,这是个免费的编辑器,不如Sublime强大,但是也可以通过一些插件来解决问题,比如有一个插件JSTool,可以用来格式化JS代码,比较轻量级,修改小问题,我经常使用这个。
        总的来说,我比较喜欢用的有Netbeans、NTVS和Nodepad++
    3、常见问题的处理办法:
       1)Session:为了考虑未来扩展性,最好将session集中保存,保存在redis、memcache或者mongodb,上述方式sails默认都支持,我选择的是redis,redis只能在linux上安装,首先从redis.io下载稳定版本,然后根据README文件的内容,进行编译、安装和安装为服务,具体过程如下:
             在源代码目录依次执行
             $ make
             $ make install
             $ cd utils
             $ ./install_server.sh
             在命令行查看redis信息的命令为 redis-cli,具体命令可以参考官方文档,也可以用gui工具查看,比如Redis Desktop Manager,官网为http://redisdesktop.com/
              在sails的config目录下,修改session.js文件,修改内容类似如下
      adapter: 'redis',
      host: '192.168.1.110',
      port: 6379,
      ttl: 86400,
      db: 0,
      pass: '',
      prefix: ''
    这就可以使用了,在nodejs中使用远程session,还有一个必要性,就是V8引擎的内存限制,所以不要在主线程中存储不必要的临时变量,因为如果达到内存上限,就会导致垃圾回收或者系统出现问题。

       2)文件上传

           sails中文件上传很简单,不过需要注意的是,文件上传功能需要在form的最后,后面不能有form输入,基本内容如下
    req.file('avatar').upload({
     dirname : 'pathName'
    }, function (err, uploadedFiles) {
     if (err) {
      sails.log.error(err);
      return res.negotiate(err);
     }
     return res.json({
      message : uploadedFiles.length + ' file(s) uploaded successfully!'
     });
    });
    avatar是上传的文件名,如果是form上传,就是<input type=file name=avatar>上传的文件,这个文件可以支持多文件同时上传,如果不指定dirname,则会上传到默认临时目录,文件名是随机生成的,uploadFiles是个数组,基本格式如下
    [{
      fd : 'd:\temp\2aee7706-d0a9-4e1e-9ac0-c17ecf48be44.png',
      size : 48177,
      type : 'image/png',
      filename : 'aa.png',
      status : 'bufferingOrWriting',
      field : 'image',
      extra : undefined
     }
    ]
    可知保存的文件名为uploadFiles[i].fd,如果要修改文件名或移动文件,需要使用标准的fs包,也可以使用fs-extra包,它可以npm安装,也可以在github.com上查找相应的信息。
    在移动后台开发中,常常要将上传文件和保存到数据库分开,即上传文件到临时文件,在保存信息的同时,再操作文件,所以需要客户端上传文件名或地址,调用fs包来移动或改名文件。
    3)ORM
            sails使用的orm是waterline,用起来还可以,比较简单,大致内容如下:
    • 数据库连接保存在config/connection.js,可以选择多种数据库,不过注意需要安装相应的驱动
    • 默认的model配置保存在config/model.js,包括一些默认设置,如默认的数据库连接(connection),默认的属性(attributes),默认的移植方式(migrate),移植方式指的是是否根据模型生成数据库,我习惯于先生成数据库,再写模型,所以这里设置为safe,这个文件也可以保存一些表中共有的字段,如createdAt,updatedAt
    • 配置文件Model:保存在api/model目录下,基本内容如下
      module.exports = {
     tableName : 's_user', 
     attributes : { 
      user_code : { 
       type : 'string' 
      }, 
      user_password : { 
       type : 'string' 
      }, 
      user_email : { 
       type : 'string' 
      }, 
      user_mobile : { 
       type : 'string' 
      } 
     } 
    };
    总体来说,非常简单,tableName是数据库中的表名,attributes是列名,默认情况下属性值就是列名,如果不一样,可以增加一个columnName属性,如果关联了另外一张表,增加model属性,如下
    module.exports = {
        tableName: 't_dep',
        attributes: {
            hospital_name: {type: 'string'},
            hospital_grade: {type: 'integer'},
            province: {model: 'district'},
            city: {model: 'district'},
            county: {model: 'district'},
            hospital_address: {type: 'string'},
            hospital_desc: {type: 'string'},
            hospital_longititude: {type: 'float'},
            hospital_latitude: {type: 'float'},
            hospital_postcode: {type: 'string'},
            hospital_tel: {type: 'string'},
            created_user: {model: 'user'},
            updated_user: {model: 'user'}
        }
    };
    • 调用
    调用起来非常简单,在api/controller下的控制器文件中,直接使用模块名即可,不需要require,如User.create(),User.find()等
    基本方法如下:
    .count()
    .create()
    .destroy()
    .find()
    .findOne()
    .findOrCreate()
    .native()
    .query()
    .stream()
    .update()
    这些方法都非常容易看到用法,具体内容查看sailsjs的官方文档即可。
    • populate:
    populate用来获取关联表的数据,如Doctor.find({id:doctor_id}).populate('user').exec(function(err, doctors){}),
    在某些情况下非常容易处理
    • 注意:
    需要注意的是这些方法都是异步调用的,所以在复杂逻辑的时候需要嵌套回调函数,或者使用流程控制如async库
    在配置表中的attribute的内容中不存在的属性,是无法查询和更新的,所以在更新了数据库之后要随时记着更新attribute

    4)WebSocket

         Websocket适合做信息推送,总体上比较简单,在浏览器里处理起来非常容易,在Android中还没有试验过,不过为了开发效率,选了信鸽推送,等以后有机会再研究吧
  • 相关阅读:
    项目管理理论与实践(6)——利用Excel制作项目文档的设计技巧
    项目管理理论与实践(5)——UML应用(下)
    【工具推荐】ELMAH——可插拔错误日志工具
    ExtJs实践(1)——Ext.extend的用法
    设计一套基于NHibernate二级缓存的MongoDB组件(上)
    ExtJs实践(3)——xtype名称与控件对应
    项目管理理论与实践(2)——软件需求分析
    【培训稿件】构建WCF面向服务的应用程序(包含ppt,源代码)
    ExtJs实践(5)——解决在GridPanel中使用bbar或者tbar的分页条的宽度自适应问题
    项目管理理论与实践(3)——如何进行有效的项目管理
  • 原文地址:https://www.cnblogs.com/stone-fly/p/4341266.html
Copyright © 2020-2023  润新知