2017-02-16 17 views
1

я получаю ошибку «произошло вызова метода NotesDatabase.createDocument() Исключение нулевой» для следующих целей:XPages SSJS - Создание документа в другой базе данных

var db:NotesDatabase = session.getDatabase("", viewScope.targetDb); 
if (db != null) { 
    if(db.isOpen()){ 
    }else{ 
     db.open(); 
    } 
} else { 
} 
var doc:NotesDocument = db.createDocument(); 

Комментариев: БД база данных доступен и «открыт ». Пользователь имеет достаточно прав в targetDb для создания документов.

Что не так?

Я изменил db.isOpen на db.isOpen(), согласно советам Пола Стивена Уитера. И теперь db.open() выдает ошибку «Исключено возникший метод вызова NotesDatabase.open() null», хотя я могу получить, в переменных viewScope, сервере, FilePath и т. Д.

+0

Это полный код? можете ли вы предоставить полный сценарий, а также полное сообщение об ошибке? вы можете вывести заголовок db перед созданием документа с помощью println (db.getTitle()); ? –

+0

Используете ли вы «/» вместо «\» на своем пути? –

+0

TargetDb равен URL-адресу, установленному в другом месте приложения, другими словами «/» используется. –

ответ

2

Изменить

var db:NotesDatabase = session.getDatabase("", viewScope.targetDb); 

в

var db:NotesDatabase = session.getDatabase(currentDatabase.getServer(), viewScope.targetDb); 

Это работает в Интернете, а также XPinC.

XPages не такой же, как формула, она не любит пустое определение строки для имени сервера, которое противоречит документации, которая гласит (для сервера параметра NotesSession.getDatabase - JavaScript) :]

Имя сервера, на котором находится база данных. Используйте нуль для указует среду на сеансе, например, текущий компьютер

Использование нуля или «» дает ошибку 500, казалось бы.

Код из вопроса будет работать, если:

  • если блок удаляется полностью
  • переменная viewScope.targetDb имеет правильно указанный путь к файлу базы данных заметок, которые существует на том же сервере, что и текущая база данных
  • Текущий пользователь имеет доступ к целевой базе данных (по ACL), с правом создания базы данных
  • целевой базы данных имеет максимальное Интернет имя и пароль выше чтения в соответствии с @Paul
+0

Я изменил «» на database.getServer(), все еще такое же сообщение об ошибке. –

+0

Спасибо, это решение! Нельзя использовать URL-адрес, но путь db с «/» –

0

Pro Tip - получить Debug Toolbar и используйте это, чтобы распечатать сообщения на панели инструментов отладки XPage, чтобы узнать, что происходит, и если ваша переменная viewScope установлена. Кроме того, научитесь использовать блок catch try, чтобы поймать свои исключения и распечатать сообщение об ошибке на панели инструментов отладки. Вы найдете свою проблему таким образом. https://www.openntf.org/main.nsf/project.xsp?r=project/XPage%20Debug%20Toolbar

+0

Я использую панель инструментов Debug и устанавливаю различные переменные viewScope, чтобы увидеть, что происходит. –

1

Я подозреваю, что причина вы проверяете db.isOpen. Вы должны проверить db.isOpen().

Стоит иметь в виду session.getDatabase(String, String) не возвращает null (если вы не используете OpenNTF Domino API).Он возвращает объект базы данных, который не открыт. Так что если утверждение не имеет значения. Также лучше всего передать имя сервера session.getDatabase() - вы получите другой результат, если приложение когда-либо используется в XPiNC с вашим текущим кодом.

Независимо от доступа пользователей к физическим лицам, «Максимальное имя и пароль Интернета» на вкладке «Дополнительно» ACL переопределит это. Если максимальный доступ в Интернет - нет доступа, никто не сможет создавать документы. Но я подозреваю, что это не фактор.

+1

Не забывайте, что последний параметр * createOnFail *, который является * true * по умолчанию. Установка его в * false * приведет к ошибке, если база данных не существует –