2016-11-06 42 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