Helma中关于的User的问题


一、使用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

你可能感兴趣的:(JavaScript,prototype)