Troubleshooting
Common framework issues and their solutions. For Builder-specific problems (compilation, dependencies, deployment), see Builder Troubleshooting.
LCP / Connector Errors
"Method not found" or empty response from @Extern call
Symptom: Frontend connector call returns null, throws "method not found", or silently fails.
Causes and fixes:
-
Missing ForceCompile entry — The backend class must be imported in
ForceCompile.ts. If not, the class is never compiled into the bundle and LCP cannot resolve it.oidis build dev # Rebuilds and auto-generates ForceCompile entries -
Wrong namespace in
getServerNamespaces()— The frontend connector's namespace string must exactly match the backend class path. Check for typos:// Frontend connector
map.set(WebServiceClientType.HUB_CONNECTOR, "Io.Oidis.YourProject.Utils.DataManager");
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Must match the actual filesystem path: source/typescript/Io/Oidis/YourProject/Utils/DataManager.ts -
Method not decorated with
@Extern()— Verify the backend method has the decorator. -
AuthManager not registering the method — New
@Externmethods must be registered in the AuthManager. See Authorization Flow.
"Unauthorized" or 403 on @Extern calls
Symptom: LCP call is rejected with an authorization error.
Causes and fixes:
-
Method not in permission category — Register it in
AuthManager:this.generateAuthMethodsFrom<YourConnector>(AuthMethodCategory.ONLY_FOR_AUTHORIZED_USERS,
YourConnector, ($proto : YourConnector) => [$proto.YourMethod]); -
User lacks group permission — Check if the method is restricted to a specific system group via
addSystemPermissions(). See System Groups. -
Session expired — Check browser DevTools network tab for 401 responses. The session may have timed out.
Database Issues
Models return empty results
Symptom: Find() returns an empty array or fewer results than expected.
Causes and fixes:
-
Soft-deleted records filtered out — If you're filtering
{ deleted: { $ne: true } }but the records were hard-deleted withRemove(), they won't exist at all. If you're NOT filtering, soft-deleted records will appear.warningFind()does not automatically exclude soft-deleted documents. Always include{ deleted: { $ne: true } }in your filter unless you specifically need deleted records. -
Wrong database — Verify
commons.jsonppoints to the correct database. Check the database name in the MongoDB shell:mongosh --port 27018
> show dbs -
Collection name mismatch — The
@Entity("collectionName")decorator must match the actual MongoDB collection. Collection names are case-sensitive.
"Cannot read properties of null" on model fields
Symptom: Accessing a model property throws a null reference error.
Cause: The model was found but the field doesn't exist in the document (e.g., added after existing records were created).
Fix: Use @Property({ default: ... }) to provide defaults, or check for null before accessing:
const value = record.SomeField ?? "default";
Development Workflow
Hot reload not picking up changes
Symptom: oidis dev is running but changes don't appear in the browser.
Causes and fixes:
-
Wrong file type —
oidis devwatches TypeScript and SCSS files. Changes to JSONP config, HTML templates, or static assets require a full rebuild:oidis build dev -
Compilation error — Check the terminal running
oidis devfor TypeScript errors. A failed compilation means no new output. -
Browser cache — Hard refresh with
Ctrl+Shift+R(orCmd+Shift+Ron macOS).
Stale artifacts after branch switch
Symptom: Build errors or unexpected behavior after switching branches or pulling large changes.
Fix: Run a clean rebuild:
oidis rebuild # Equivalent to: clean + build dev
If the issue persists, reinstall dependencies:
oidis install # Re-clones all dependencies from Git
oidis rebuild
oidis install deletes the entire dependencies/ directory before reinstalling. Commit or sync any changes in dependencies/ before running this command.
Lint errors blocking commit
Symptom: Pre-commit hook rejects the commit with lint violations.
Fix: Run the linter to see exact violations, fix them, then commit again:
oidis test lint
Common violations:
- Missing space before/after type colon (
name: string→name : string) - Single quotes instead of double quotes
- Missing
.jsextension in imports - Missing copyright header
- Wrong member ordering (fields before methods)
See Code Review Checklist for the full list.
Authentication
Login fails with correct credentials
Causes and fixes:
-
Account locked — Too many failed attempts. Check
authManagerWorker.singInCheck.numberOfTriesincommons.jsonp. The account auto-unlocks after the configured interval. -
Account deactivated — The activation check worker may have deactivated the account. Check the Hub admin panel.
-
Multi-session disabled — If
authManagerWorker.multiSessionEnabledisfalse, logging in from a second browser/device invalidates the first session.
SSO redirect loop
Symptom: Browser redirects between the login page and the OAuth provider in a loop.
Causes and fixes:
-
Redirect URI mismatch — The
redirectUriinauthProviders.googlemust exactly match the URI registered in the Google Cloud Console. -
Cookie domain mismatch — Check that the
domainsetting incommons.jsonpmatches the actual server hostname. Cookies set for a different domain are silently ignored by the browser. -
Strict secure cookies on HTTP — If
authManagerWorker.strictSecureSSOcookiesistruebut the server runs on HTTP (no TLS), the browser rejects the cookies. Disable this flag for local development.
Email
Emails not being sent
Symptom: Registration, password reset, or notification emails are not delivered.
Causes and fixes:
-
Mail engine disabled — Check
sendmail.enabledincommons.jsonpor in Application Settings (Hub GUI). -
Queue not processing — The async loop may not have started. Check
sendmail.fetchTick— if set to0, the loop is disabled. -
Recipient on blacklist — Addresses in
sendmail.blackListare silently excluded. Check the list in Application Settings. -
SMTP connection failed — Check SMTP host, port, and credentials in
commons.jsonp. Test connectivity from the server.
Common Error Messages
| Error | Likely cause | Fix |
|---|---|---|
Target folder has not been recognized | Wrong directory or missing package.conf.jsonp | cd to project root |
Cannot find module "@io-oidis-..." | Dependencies not installed | Run oidis install |
ExternInvokeEnabled is false | Connector disabled programmatically | Check if ExternInvokeEnabled(false) is set |
Multiple internal setting structures found | Duplicate appSettings documents in DB | Remove duplicates, keep one |
strict email check failed | Duplicate email during registration | Enable strictEmailCheck or check existing accounts |
this.events.Subscribe is not a function | A tab id or member named events overwrites GuiCommons.events | Rename it — see GUI Pitfalls |
Types have separate declarations of a private property '…' | Panel/dialog/row member reuses a private CORE member name | Rename the member — see GUI Pitfalls |
Property 'Text' does not exist on type 'Button' | Button has no Text() | Use Content() |
See also: Builder Troubleshooting | Oidis Builder Quick Start | LCP & RPC | Authentication