我有一个.yaws文件,该文件从我编写的setup/0
模块调用authenticate
函数,该模块已放置在ebin
目录中。当我从Erlang外壳程序调用authenticate:setup/0
时,它会创建一个表,但是当我在浏览器中加载something.yaws时(调用authenticate:setup/0
函数),它将返回{aborted,{bad_type,users,disc_copies,nonode@nohost}}
(something.yaws只是返回嵌入在html中的authenticate:setup/0
的返回值用于调试)。
这是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,nonode@nohost}}
如果我在以
erl -mnesia dir '"/usr/local/lib/yaws-appmods/mnesia/"'
开头的Erlang shell中运行相同的erlang代码,则效果很好。 最佳答案
当您运行Yaws时,请传递命令行选项--mnesiadir dir
告诉它您希望将其存储在哪里。该选项的dir
参数应该是您希望数据存在的目录的路径名。例如,传递--mnesiadir /tmp
将导致Yaws将健忘症数据存储在/tmp
目录中。
顺便说一句,如果将不带Yaws的Erlang外壳程序传递给它,将mnesia数据目录设置为不存在的mnesia dir
选项,则会看到相同的错误:
$ 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命令定义与您使用的相同user
记录,第二个命令执行与authenticate:setup/0
函数相同的步骤。如图所示,它返回与Yaws相同的错误。请注意,Yaws
'"/xyzfoo"'
选项不需要将目录正确地传递给Erlang shell(无论如何在典型的基于UNIX的系统上)所需的目录名称--mnesiadir
的引号。还要注意,Erlang选项是单个连字符,后跟两个单词mnesia
和dir
,后跟带引号的目录名,而对于Yaws,该选项是一个单词mnesiadir
后跟两个连字符,后跟一个普通目录名。编辑:如果为Yaws设置了mnesia目录之后,您仍然看到问题,那是因为您正在尝试在mnesia已经运行之后创建架构。当Yaws看到
--mnesiadir
选项时,它将启动mnesia应用程序。因此,您应该在运行Yaws之前创建架构,或者在创建架构之前停止mnesia。将authenticate:setup/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)}]).
关于web - Mnesia在由Yaws运行时无法创建表,但是在从Erlang Shell运行时可以创建表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40454390/