2016-11-06 17 views
2

ebin 디렉토리에 배치 한 authenticate 모듈에서 setup/0 함수를 호출하는 .yaws 파일이 있습니다. Erlang 쉘에서 authenticate:setup/0을 호출하면 테이블이 잘 생성되지만, authenticate:setup/0 함수를 호출하는 브라우저에서 something.yaws를로드하면 {aborted,{bad_type,users,disc_copies,[email protected]}}을 반환합니다 (something.yaws는 html에 authenticate:setup/0의 반환 값을 반환합니다). 디버깅 목적으로). 여기 Mnesia는 Yaws에 의해 실행될 때 테이블을 만들 수 없지만 Erlang 쉘에서 실행될 수 있습니다.

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}). 

(I 그래서, 내가 브라우저에서 그것을 시도 한 후 얼랑 쉘에서 호출 시도 그걸로 간섭하지 못했습니다.)

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

erl -mnesia dir '"/usr/local/lib/yaws-appmods/mnesia/"'으로 시작되는 Erlang 쉘에서 동일한 erlang 코드를 실행하면 정상적으로 작동합니다.

답변

4

Yaws를 실행하는 경우 명령 줄 옵션 --mnesiadir dir을 전달하여 저장 데이터를 저장할 위치를 지정하십시오. 옵션의 인수 dir은 데이터를 저장할 디렉토리의 경로 이름이어야합니다. 예를 들어 --mnesiadir /tmp을 전달하면 Yaws가 기억 상실 데이터를 /tmp 디렉토리에 저장합니다. 당신이 그것을 존재하지 않는 무언가에 mnesia 데이터 디렉토리를 설정하는 mnesia dir 옵션을 전달하면

BTW, 당신은 딸기 종없이 얼랑 쉘과 같은 오류를 볼 수 있습니다 여기에

$ 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 쉘 명령은 사용중인 동일한 user 레코드를 정의하고 두 번째 명령은 authenticate:setup/0 기능과 동일한 단계를 수행합니다. 표시된 것처럼 Yaws와 동일한 오류를 반환합니다. 특이한 여기 (어쨌든, 전형적인 UNIX 기반 시스템) 얼랭 셸에 제대로 옵션을 통과에 필요한 디렉토리 이름, '"/xyzfoo"'에 대한 표시 인용이

은 참고 딸기 종 --mnesiadir 옵션이 필요하지 않습니다. 또한 Erlang 옵션은 단일 하이픈과 두 단어, mnesiadir 다음에 인용 된 디렉토리 이름이 오는 반면 Yaws의 경우 옵션은 하나의 단어 mnesiadir 앞에 두 개의 하이픈과 그 뒤에 일반 디렉토리 이름이 오는 것을주의하십시오.

EDIT : Yaws에 대한 mnesia dir을 설정 한 후에도 여전히 문제가 발생하는 경우, mnesia가 이미 실행 된 후에 스키마를 만들려고하기 때문입니다. Yaws가 --mnesiadir 옵션을 보게되면 mnesia 응용 프로그램이 시작됩니다. 따라서 Yaws를 실행하기 전에 스키마를 작성하거나 스키마를 작성하기 전에 mnesia를 중지해야합니다.다음에 authenticate:setup/0 기능을 변경, 그리고 딸기 종에서 작동합니다 : 나는``아직도 나에게 원래 오류를 준 DIR`이,이 일을해야하더라도, 나는 시도 --mnesiadir 딸기 종을 시도

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

erl -mnesia dir ' "DIR"''을 사용합니다 (DIR은 두 경우 모두 동일한 디렉토리를 나타냄). yaws의 출력은 코멘트에 맞지 않으므로 필자의 메인 포스트로 편집 할 것입니다. – user1792131