Web 记忆可以';当由Yaws运行时,不能创建表,但从erlangshell运行时可以创建表

Web 记忆可以';当由Yaws运行时,不能创建表,但从erlangshell运行时可以创建表,web,erlang,mnesia,yaws,erlang-shell,Web,Erlang,Mnesia,Yaws,Erlang Shell,我有一个.yaws文件,它从我编写的authenticate模块调用setup/0函数,我把它放在ebin目录中。当我从Erlang shell调用authenticate:setup/0时,它会创建一个表,但是当我在浏览器中加载something.yaws时,它会调用authenticate:setup/0函数,返回{aborted,{bad_type,users,disc_copies,nonode@nohost}}(出于调试目的,something.yaws只返回html中嵌入的authe

我有一个.yaws文件,它从我编写的
authenticate
模块调用
setup/0
函数,我把它放在
ebin
目录中。当我从Erlang shell调用
authenticate:setup/0
时,它会创建一个表,但是当我在浏览器中加载something.yaws时,它会调用
authenticate:setup/0
函数,返回
{aborted,{bad_type,users,disc_copies,nonode@nohost}}
(出于调试目的,something.yaws只返回html中嵌入的
authenticate:setup/0
的返回值)

以下是
设置/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)}]).
下面是
用户
记录:

-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,nonode@nohost}}
Erlang/OTP19[erts-8.1][source][64位][smp:8:8][async threads:10][kernel poll:true] Eshell V8.1(使用^G中止) 1> =信息报告===2016年11月7日::00:04:49=== Yaws:使用配置文件/etc/Yaws/Yaws.conf =信息报告===2016年11月7日::00:04:49=== Yaws:使用全局子配置文件/etc/Yaws/conf.d/localhost.conf =信息报告===2016年11月7日::00:04:49=== Ctlfile:/home/username/.yaws/yaws/default/CTL =信息报告===2016年11月7日::00:04:49=== Yaws:侦听虚拟服务器的0.0.0.0:8080: - http://localhost:8080 在/usr/share/yaws/www下 rd(用户,{username,hashed_pw,salt})。 用户 2> mnesia:create_schema([node()]),mnesia:start(),mnesia:create_table(用户,[{type,set},{record_name,user},{disc_copies,[node()]},{attributes,record_info(字段,用户)}])。 {中止,{坏类型,用户,光盘副本,nonode@nohost}}
如果我在Erlangshell中运行相同的erlang代码,以“
erl-mnesia dir'”/usr/local/lib/yaws-appmods/mnesia/”开头“
,它工作得很好。

运行Yaws时,传递命令行选项
--mnesiadir-dir
,告诉它存储mnesia数据的位置。该选项的
dir
参数应该是您希望数据所在目录的路径名。例如,传递
--mnesiadir/tmp
将导致Yaws to将记忆数据存储在
/tmp
目录中

顺便说一句,如果您向Erlang shell传递一个mnesia
dir
选项,将mnesia数据目录设置为不存在的内容,那么您可以在没有Yaws的Erlang shell中看到相同的错误:

$ 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,nonode@nohost}}
在这里,我们假设没有这样的目录
/xyzfoo
。第一个Erlang shell命令定义您正在使用的
用户
记录,第二个命令执行与
验证:设置/0
函数相同的步骤。如图所示,它返回与Yaws相同的错误

请注意,此处显示的目录名“
”“/xyzfoo”
”的不寻常引用是将选项正确传递给Erlang shell所必需的(无论如何,在典型的基于UNIX的系统上),对于Yaws
--mnesiadir
选项不是必需的。还要注意,Erlang选项是一个连字符,后跟两个单词,
mnesia
dir
,后跟引用的目录名,而对于Yaws,选项是一个单词
mnesiadir
,前面是两个连字符,后面是一个普通目录名。

编辑:如果在为Yaws设置mnesia dir之后,您仍然看到问题,这是因为您试图在mnesia已经运行之后创建架构。当Yaws看到
--mnesia dir
选项时,它会启动mnesia应用程序。因此,您应该在运行Yaws之前创建架构,或者在创建之前停止mnesia您的架构。将
身份验证:设置/0
函数更改为以下内容,它将在Yaws中工作:

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)}]).
我尝试了
yaws--mnesiadir-DIR
,它仍然给了我最初的错误,尽管它应该可以工作,然后我尝试了
erl-mnesia-DIR的“DIR”
,它确实工作了(DIR在这两种情况下代表同一个目录)。yaws的输出不适合注释,所以我将它编辑到我的主要帖子中。