[img]http://dev.helma.org/static/files/0/helma-glossy-100px.png[/img]
[color=red]一、[/color]使用User对象时的注册问题:
Helma中user对象的注册有两种方式,一种通过[color=indigo]var u = new User();[/color]的方式。另一种是通过[color=indigo]app. registerUser(username, password)[/color]的方式。但经过使用存在如下问题:
[color=blue]1.[/color]在使用Helma自己的数据库时,请使用[color=indigo]app.registerUser(username,password)[/color]这种方式。Helma在插入时就是根据用户名进行的判断,如果用户名重复,它不会进行注册。如果用户名不存在,则进行注册,所以它能准确的将用户名插入到它自己的数据库中。如果使用[color=indigo]var u = new User();[/color]的这种方式会出现一个问题,就是数据库中的用户名插入不到Helma中的数据库中(或许我还没有找到插入的方式)。我做过测试,使用这种方式时,数据库用户名全部为"User",而不是我们注册的用户名。
[color=blue]2.[/color]在不使用Helma的数据库时,两种方式都可以使用,但两者在使用时在原型上有一定的区别。
(1)使用[color=indigo]var u = new User();[/color]时一定要注意User的原型的定义:
_name = 数据库中的用户字段名
password = 数据库中的密码字段名
uname = 数据库中的用户字段名 //为什么要加上这句话?我一会就解释
下面我解释一下为什么要加上这句话:先看我们注册的一段代码
var u =new User();
u.uname=req.data.username;//我们关注这一句,注册时不是用u._name=req.data.username;
u.password =req.data.userpwd;
u.sex = req.data.sex; //以下的这些代码是给用户加入其它的属性,对本问题的说明没有任何作用
u.birthday = req.data.birthday;
u.email = req.data.email;
this.users.add(u);//添加用户,这句话是不可少的,这才是真正的注册的一句话(这句话是假定将User挂载到Root的users下)
现在大家大概明白了吧,原型中的[color=blue]uname[/color]与[color=blue]_name[/color]指向的都是数据库中的用户字段名。因为在进行注册赋值时,用[color=indigo]u._name=req.data.username;[/color]是不行的,它是相当于javascript中的prototype中的一个原型属性,是不能被赋值的。如果我们不指定[color=blue]uname[/color](uname是自定义的一个属性名,你可以随便起名),那么数据库中的用户名的字段也会是[color=blue]"User"[/color],而不是我们注册时的用户名。
(2)使用[color=indigo]app.registerUser(username,password);[/color]这种方式,原型中可以不用定义额外的一个属性也能进行正确的注册。但是注意,在使用这种方式时,user对象的挂载路径会有问题。
[color=red]二、[/color]在使用[color=indigo]app.registerUser(username,password);[/color]来注册user对象的挂载路径问题:
假如我们将user对象挂载到在Root根目录下面的users
#Root
users = collection(User)
users.accessname=USERNAME
我们想将user对象挂载到Root的users下面,挂载点为[color=blue]USERNAME[/color]。但是注意了,使用[color=indigo]app.registerUser(username,password);[/color]来注册,之后就有问题了:
var u = app.getUser(req.data.username);//通过前端页面的用户名来获取一个用户对象
res.redirect(u.href()+"main");//重定向到User对象内部的main方法去
这时的路径就很可能出现问题。我们想使用的路径:[color=blue]
http://localhost:8080/test/users/用户名/[/color]
而它的路径却是:[color=blue]
http://localhost:8080/test/用户名[/color]
所以说它没有按我们的要求挂载到我们想要的目录下面,而是挂载到应用[color=blue]test[/color]的下面了。这是因为,[color=blue]app.registerUser(username,password);[/color]默认的挂载是在应用之下。要想让它正确,必须这样来做,这是常用的办法。
//User目录下的type.properties文件如下
#User
_parent=root.users //明确指明user对象挂载的位置,这样就不是默认挂到应用下了
_name = USERNAME
username=USERNAME //上面指定了挂载位置,它要按照你的username属性来找到你的挂载而不是通过_name,所以这句话是必需的
password = PASSWORD
还有另一个解决办法,那就是不用[color=blue]USERNAME[/color]挂载,而是用[color=blue]ID[/color]来挂载:
#Root
users = collection(User)
users.accessname=ID
意思就是你使用[color=blue]ID[/color]来挂载user,而不要用“用户名字段”来挂载user。如果你在[color=blue]Root[/color]原型中没有[color=blue]accessname=ID[/color]时,它默认的就是用ID来挂载。当用ID来挂载时,Helma能按照你的意图来挂载。而不用再在[color=blue]User[/color]原型下设置[color=blue]_parent=root.users[/color]了
[color=red]三、[/color]在使用Helma的数据库时的问题:
如果使用Helma的数据库,我们知道User的原型为
#User
username
password
这里虽然原型为的用户名虽然用username,但在Helma程序中取值时用的并不是username,而是name,所以使用时一定要注意。下面是代码:
var uname= u.username;//这种用法是错误的
var uname=u.name;//这种用法才是正确的
如果是用自己的数据库,最好而且建议原型中也要有一个username,但访问时就是用username,而不是用name