2016-11-06 7 views
2

Ich habe eine .yaws-Datei, die die setup/0-Funktion aus dem authenticate-Modul, das ich in das Verzeichnis ebin platziert habe. Wenn ich authenticate:setup/0 von der Erlang-Shell aufrufen, erstellt es eine Tabelle, aber wenn ich etwas laden.yaws im Browser, der die authenticate:setup/0-Funktion aufruft, gibt es {aborted,{bad_type,users,disc_copies,[email protected]}}10 (something.yaws gibt nur den Rückgabewert authenticate:setup/0 in HTML eingebettet zu Debuggingzwecken).Mnesia kann keine Tabellen erstellen, wenn es von Yaws ausgeführt wird, aber wenn es von der Erlang-Shell ausgeführt wird

Hier ist die setup/0 Funktion:

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

und hier ist der user Rekord:

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

(Ich habe versucht, es von der Erlang-Shell aufrufen, nachdem ich es im Browser versucht haben, so das hätte nicht stören können.)

Wenn ich yaws --mnesiadir /usr/local/lib/yaws-appmods/mnesia/ ausführen, bekomme ich

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]}} 

Wenn ich den gleichen Erlang-Code in der Erlang-Shell mit erl -mnesia dir '"/usr/local/lib/yaws-appmods/mnesia/"' gestartet habe, funktioniert es gut.

Antwort

4

Wenn Sie Yaws ausführen, übergeben Sie die Befehlszeilenoption --mnesiadir dir, um anzugeben, wo Sie Mnesien-Daten speichern möchten. Das Argument dir der Option sollte der Pfadname des Verzeichnisses sein, in dem die Daten gespeichert werden sollen. Wenn Sie beispielsweise --mnesiadir /tmp übergeben, speichert Yaws Mnesien-Daten im Verzeichnis /tmp.

BTW, können Sie den gleichen Fehler mit der Erlang-Shell ohne Yaws sehen, wenn Sie es eine Mnesia dir Option übergeben, die die Mnesia Datenverzeichnis etwas nicht vorhandene Sätze:

$ 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]}} 

Hier nehmen wir an, es gibt keine solche Verzeichnis /xyzfoo. Der erste Erlang-Shell-Befehl definiert denselben user Datensatz, den Sie verwenden, und der zweite Befehl führt die gleichen Schritte wie Ihre authenticate:setup/0-Funktion aus. Wie gezeigt, gibt es denselben Fehler wie bei Yaws.

Beachten Sie, dass die ungewöhnliche hier für die Verzeichnisnamen angezeigt zitierte, '"/xyzfoo"', erforderlich für die Möglichkeit, richtig an der Shell Erlang vorbei (auf typischen UNIX-basierte Systemen, sowieso), ist nicht notwendig für die Yaws --mnesiadir Option. Beachten Sie außerdem, dass die Erlang-Option ein einzelner Bindestrich gefolgt von zwei Wörtern mnesia und dir ist, gefolgt von dem Namen des zitierten Verzeichnisses, während für Yaws die Option ein Wort mnesiadir mit zwei Bindestrichen gefolgt von einem einfachen Verzeichnisnamen ist.

BEARBEITEN: Wenn Sie nach dem Festlegen des MND für Yaws immer noch Probleme sehen, liegt es daran, dass Sie versuchen, Ihr Schema zu erstellen, nachdem MNS bereits ausgeführt wird. Wenn Yaws die Option --mnesiadir sieht, wird die Mneste-Anwendung gestartet. Sie sollten daher entweder Ihr Schema erstellen, bevor Sie Yaws ausführen, oder Mnesien stoppen, bevor Sie Ihr Schema erstellen.Ändern Sie Ihre authenticate:setup/0 Funktion auf die folgenden, und es wird von Yaws arbeiten:

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

Ich habe versucht, 'Framboesie --mnesiadir DIR', die mir immer noch den ursprünglichen Fehler gab, obwohl sie gearbeitet haben sollte, dann habe ich versucht,' erl -mnesia dir '"DIR"' ', was funktioniert hat (DIR repräsentiert in beiden Fällen dasselbe Verzeichnis). Die Ausgabe von Yaws passt nicht in einen Kommentar, also werde ich es in meinen Hauptpost bearbeiten. – user1792131

Verwandte Themen