2016-11-06 37 views
2

我有调用从authenticate模块我写的,我已经放在ebin目录setup/0功能的.yaws文件。当我从Erlang shell调用authenticate:setup/0时,它会创建一个表格,但是当我在浏览器中加载了一个叫做authenticate:setup/0函数的东西时,它会返回{aborted,{bad_type,users,disc_copies,[email protected]}}(something.yaws只是返回嵌入在html中的返回值authenticate:setup/0用于调试目的)。的Mnesia不能创建表,但可以从二郎跑时外壳

这里的setup/0功能:

setup() -> 
    mnesia:create_schema([node()]), 
    mnesia:start(), 
    mnesia:create_table(users, [{type, set}, {record_name, user}, {disc_copies, [node()]}, {attributes, record_info(fields, user)}]). 

和这里的user记录:

-record(user, {username, hashed_pw, salt}). 

(我试图从Erlang shell的调用它,我在浏览器中尝试之后,所以不能干扰它。)

如果我运行yaws --mnesiadir /usr/local/lib/yaws-appmods/mnesia/,我得到

Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:8:8] [async-threads:10] [kernel-poll:true] 

Eshell V8.1 (abort with ^G) 
1> 
=INFO REPORT==== 7-Nov-2016::00:04:49 === 
Yaws: Using config file /etc/yaws/yaws.conf 

=INFO REPORT==== 7-Nov-2016::00:04:49 === 
Yaws: Using global subconfig file /etc/yaws/conf.d/localhost.conf 

=INFO REPORT==== 7-Nov-2016::00:04:49 === 
Ctlfile : /home/username/.yaws/yaws/default/CTL 

=INFO REPORT==== 7-Nov-2016::00:04:49 === 
Yaws: Listening to 0.0.0.0:8080 for <1> virtual servers: 
- http://localhost:8080 under /usr/share/yaws/www 
rd(user, {username, hashed_pw, salt}). 
user 
2> mnesia:create_schema([node()]), mnesia:start(), mnesia:create_table(users, [{type, set}, {record_name, user}, {disc_copies, [node()]}, {attributes, record_info(fields, user)}]). 
{aborted,{bad_type,users,disc_copies,[email protected]}} 

如果我在Erlang外壳中运行相同的erlang代码,并以erl -mnesia dir '"/usr/local/lib/yaws-appmods/mnesia/"'开头,它就可以工作。

回答

4

当您运行Yaws时,请通过命令行选项--mnesiadir dir来告诉它它在哪里存储mnesia数据。该选项的dir参数应该是您希望数据存在的目录的路径名。例如,传递--mnesiadir /tmp将导致Yaws在/tmp目录中存储mnesia数据。

顺便说一句,你可以看到有没有雅司病Erlang的外壳相同的错误,如果你传递一个Mnesia的dir选项设置Mnesia的数据目录的东西不存在的:

$ erl -mnesia dir '"/xyzfoo"' 
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] 

Eshell V8.1 (abort with ^G) 
1> rd(user, {username, hashed_pw, salt}). 
user 
2> mnesia:create_schema([node()]), mnesia:start(), mnesia:create_table(users, [{type, set}, {record_name, user}, {disc_copies, [node()]}, {attributes, record_info(fields, user)}]). 
{aborted,{bad_type,users,disc_copies,[email protected]}} 

这里,我们假设没有这样的目录/xyzfoo。第一个Erlang shell命令定义了您正在使用的相同的user记录,第二个命令执行与您的authenticate:setup/0函数相同的步骤。如图所示,它返回与Yaws一样的错误。这不寻常的报价在这里为目录名,'"/xyzfoo"',需要正确地传递选项Erlang的外壳(典型的基于UNIX的系统,反正)所示

注意,是没有必要的雅司病--mnesiadir选项。另请注意,Erlang选项是一个单一的连字符,后跟两个单词mnesiadir,后跟引用的目录名称,而对于Yaws,该选项是一个单词mnesiadir,前面有两个连字符,后跟一个纯文本目录名称。

编辑:如果在为Yaws设置mnesia目录之后,你仍然看到问题,这是因为你正试图在mnesia已经运行之后创建你的模式。当Yaws看到--mnesiadir选项时,它启动mnesia应用程序。因此,您应该在运行Yaws之前创建您的模式,或者在创建模式之前停止mnesia。更改authenticate:setup/0功能以下内容,它将从雅司工作:

setup() -> 
    mnesia:stop(), 
    mnesia:create_schema([node()]), 
    mnesia:start(), 
    mnesia:create_table(users, [{type, set}, {record_name, user}, {disc_copies, [node()]}, {attributes, record_info(fields, user)}]). 
+0

我试过'雅司病--mnesiadir DIR',这还是给了我原来的错误,即使它应该有工作的话,我试过' erl -mnesia dir''DIR''',它确实有效(DIR在两种情况下表示相同的目录)。雅司的输出不适合注释,所以我会将其编辑到我的主帖中。 – user1792131