曲线scala

前些天看scala,对函数式充满疑惑。心想,scala这么杂,若不干脆找个纯函数式语言来看看。
于是上infoq找了找,发现nodejs最近比较热,单线程高并发WEB架构。那就拿它来试水吧。


当前nodejs最新版本是v0.8.16。简单的看了一下,就是javascript在node环境下,可能干好多好多事情。由於单纯学习起来比较枯燥,于是把express3.3.4安装起来。


又学习下express。
express环境也比较简单,是一个基于nodejs的MVC框架,看过外媒那篇经典的nodejs入门之后,对于express就不会觉得突兀。因为express是在基于简单mvc思想构造下的封装而已。不需要太过于关注其内容。先学习下使用。
首先是跑express

命令行node app 就行了

node app




在选择模板语言的时候考虑了一下,是使用默认jade,还是资料更多的ejs呢。ejs难度不大,套些html就行了。于是转用jade。jade与zen coding相差不大,不过也算是比较好的haml实现。喜欢haml的简洁。不过学习曲线挺陡,自己在tabs跟space上面吃了一些亏。要注意排版,其他的语法糖,记住就行了。

这里给一个简单的jade例子

       

doctype 5
html
  head
    title= title
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
      div#navigation
      ul
          li
              a(href='/') Index
          li
              a(href='/signup') SignUp
          li
              a(href='/signin') SignIn
          if locals.user
            li
                a(href='/prefile') #{locals.user.name}
            li
                a(href='/signout') SignOut
            li
                a(href='/role/create') Role Create

    //-
        if locals.error
          #{locals.error}
        if locals.success
          #{locals.success}
        if locals.phone
          #{locals.phone}
        if locals.iphone
          #{locals.iphone}

    if flash.error
      li= flash.error
    if flash.success
      li= flash.success

    block content

//
   Created with JetBrains WebStorm.
   User: linpeng
   Date: 13-8-13
   Time: PM 3:47

extends layout

block content
    h1= title
    p Welcome to #{title}

    if !locals.user
        form#signin_form(method='POST',action='/signin')
            label(for="username")
            input(type="text",id="username",name="user[username]")
            label(for="password")
            input(type="password",id="password",name="user[password]")
            input(type="submit",value="提交")



然后又需要操作数据库,跟nodejs搭配的多是mongodb,自己也下载了一个安装。然后就是学习下mongodb的基本操作。


mongod -dbpath dbpath -port 27017
mongo


use dbname;
show dbs;
db.collection.find()
db.collection.find({name:'name'});

        下面给出一个mongo例子:

      

C:\Users\linpeng>mongo
MongoDB shell version: 2.4.5
connecting to: test
Server has startup warnings:
Wed Aug 14 09:37:05.570 [initandlisten]
Wed Aug 14 09:37:05.570 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
Wed Aug 14 09:37:05.571 [initandlisten] **       32 bit builds are limited to less than 2GB of data (or less with --journal).
Wed Aug 14 09:37:05.572 [initandlisten] **       Note that journaling defaults to off for 32 bit and is currently off.
Wed Aug 14 09:37:05.573 [initandlisten] **       See http://dochub.mongodb.org/core/32bit
Wed Aug 14 09:37:05.574 [initandlisten]
> use makkt
switched to db makkt
> show collections;
roles
sessions
system.indexes
units
users
> db.users.find();
{ "name" : "admin", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520adf6a00ae8a2008000001"), "__v" : 0 }
{ "name" : "222", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520aeb7a8fa98f8c1d000001"), "__v" : 0 }
{ "name" : "demo", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520b372544f01e981d000002"), "__v" : 0 }
> db.users.find({name:'admin'});
{ "name" : "admin", "password" : "vL4zZeasleosA0OiOVg03Q==", "_id" : ObjectId("520adf6a00ae8a2008000001"), "__v" : 0 }



然后是写了个网站登录、网站注册、网站注销的demo。
从demo里面也看得出纯手工操作mongodb是比较麻烦的。
于是便把mongoose找来。npm install mongoose 或在package.json里面的dependencies里加mongoose:"*"


然后就是对照mongoose官网翻阅了一翻,先连接mongodb,然后写Schame,然后Model。最后exports出去。这样mongoose的工作就完了。没什么比较麻烦的东西,主要是Schame的定义以及Query查询。

  这里给一个Model的例子

  

/**
 * Created with JetBrains WebStorm.
 * User: linpeng
 * Date: 13-8-9
 * Time: PM 2:11
 */
var mongoose = require('mongoose');
var config = require('./../config');

var nameProperty = { type: String, index: { unique: true }};
var userSchema = mongoose.Schema({
    name:nameProperty, password:String
});

var User = mongoose.model('user',userSchema);

module.exports = User;



又发现网站需要flash操作。于是npm install flashify


npm WARN package.json [email protected] No README.md file found!
npm http GET https://registry.npmjs.org/flashify
npm http 200 https://registry.npmjs.org/flashify
npm http GET https://registry.npmjs.org/flashify/-/flashify-0.1.2.tgz
npm http 200 https://registry.npmjs.org/flashify/-/flashify-0.1.2.tgz
[email protected] node_modules\flashify



整体来说,nodejs、express、mongoose操作都不复杂,主要难点在于集成在一起,js调试比较麻烦,ide我推荐webstorm。然后就是nodejs本身的异步处理,有些异步方法是在不根据代码顺序执行的,有时候需要注意一下,要把依赖异步处理结果的执行步骤,放在异步处理方法体内。这些问题出现在连接数据库,读磁盘等比较费时费力的操作上面。

        经过nodejs这一遭,对函数式有了初步的了解。与 java不同,函数式讲究的是返回结果,一个函数就是一个操作集,操作结束,给个结果。是动词,更少的名词,与指令式有本质区别。


   学习资料:

mongoose http://mongoosejs.com/index.html

jade语法(英文)http://naltatis.github.io/jade-syntax-docs/

中文jade https://github.com/livereload/livereload-plugins/blob/master/Jade.lrplugin/node_modules/jade/Readme_zh-cn.md


              

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章