Сначала требуется путь var path = require('path');
Во-вторых, если assets
- это папка, в которую вы хотите отправить свое содержимое, и она также находится в файле app.js
в той же папке, затем
app.use(express.static(path.resolve(__dirname, 'assets')));
Я решаю эту проблему (в разработке) использованием, синтаксический анализ преобразовывает инструменты, чтобы считать .hrl файлы и генерировать функции помощника.
Я записал учебное руководство на нем в Выходе Прерывания.
Мы используем все это время для генерации спецификаций соответствия. Красота состоит в том, что Вы ничего не должны знать о текущем состоянии записи во время разработки.
Однако, после того как Вы находитесь в производственных вещах изменение! Если Ваша запись является основанием таблицы (в противоположность определению поля в таблице), затем изменение базовой записи является более трудным (мягко говоря!).
Я не уверен, что полностью понимаю Вашу проблему, но я переместился от записей до proplists в большинстве случаев. Они намного более гибки и намного медленнее. Используя (d) ets я обычно использую несколько рекордных полей для крупного выбора и затем проверяю proplists на остающихся записях для подробного выбора.
Это кажется, что Вы хотите смочь сделать что-то как get_record_field(Field, SomeRecord)
где Field
определяется во времени выполнения кодом пользовательского интерфейса, говорят.
Вы правы в этом, Вы не можете сделать этого в стандарте erlang как записи и record_info
функция расширена и устранена во время компиляции.
Существует несколько решений, которые я использовал или посмотрел на. Мое решение следующие: (пример предоставляет доступ во время выполнения к #dns_rec
и #dns_rr
записи от inet_dns.hrl
)
%% Retrieves the value stored in the record Rec in field Field.
info(Field, Rec) ->
Fields = fields(Rec),
info(Field, Fields, tl(tuple_to_list(Rec))).
info(_Field, _Fields, []) -> erlang:error(bad_record);
info(_Field, [], _Rec) -> erlang:error(bad_field);
info(Field, [Field | _], [Val | _]) -> Val;
info(Field, [_Other | Fields], [_Val | Values]) -> info(Field, Fields, Values).
%% The fields function provides the list of field positions
%% for all the kinds of record you want to be able to query
%% at runtime. You'll need to modify this to use your own records.
fields(#dns_rec{}) -> fields(dns_rec);
fields(dns_rec) -> record_info(fields, dns_rec);
fields(#dns_rr{}) -> fields(dns_rr);
fields(dns_rr) -> record_info(fields, dns_rr).
%% Turns a record into a proplist suitable for use with the proplists module.
to_proplist(R) ->
Keys = fields(R),
Values = tl(tuple_to_list(R)),
lists:zip(Keys,Values).
Версия этого, которое компиляции доступны здесь: rec_test.erl
Можно также расширить этот динамический полевой поиск до динамического поколения matchspecs для использования с ets:select/2
или mnesia:select/2
как показано ниже:
%% Generates a matchspec that does something like this
%% QLC psuedocode: [ V || #RecordKind{MatchField=V} <- mnesia:table(RecordKind) ]
match(MatchField, RecordKind) ->
MatchTuple = match_tuple(MatchField, RecordKind),
{MatchTuple, [], ['$1']}.
%% Generates a matchspec that does something like this
%% QLC psuedocode: [ T || T <- mnesia:table(RecordKind),
%% T#RecordKind.Field =:= MatchValue]
match(MatchField, MatchValue, RecordKind) ->
MatchTuple = match_tuple(MatchField, RecordKind),
{MatchTuple, [{'=:=', '$1', MatchValue}], ['$$']}.
%% Generates a matchspec that does something like this
%% QLC psuedocode: [ T#RecordKind.ReturnField
%% || T <- mnesia:table(RecordKind),
%% T#RecordKind.MatchField =:= MatchValue]
match(MatchField, MatchValue, RecordKind, ReturnField)
when MatchField =/= ReturnField ->
MatchTuple = list_to_tuple([RecordKind
| [if F =:= MatchField -> '$1'; F =:= ReturnField -> '$2'; true -> '_' end
|| F <- fields(RecordKind)]]),
{MatchTuple, [{'=:=', '$1', MatchValue}], ['$2']}.
match_tuple(MatchField, RecordKind) ->
list_to_tuple([RecordKind
| [if F =:= MatchField -> '$1'; true -> '_' end
|| F <- fields(RecordKind)]]).
Ulf Wiger также записал parse_transform, Exprecs, который более или менее делает это для Вас автоволшебно. Я никогда не пробовал его, но код Ulf обычно очень хорош.