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