Closed jamesvillarrubia closed 1 year ago
Here's a link to an example repo: https://github.com/jamesvillarrubia/feathers_express_v5_symbol_issue
Found a way around it:
const feathers = require('../../node_modules/f5_exp/node_modules/@feathersjs/feathers');
const express = require('f5_exp');
But this feels wrong. I guess the expectation that two different imports would leverage the same runtime scope and share Symbols() seems ripe for a downstream issue.
As an idea, would modification of the commons createSymbol to be globally scoped work better? https://github.com/feathersjs/feathers/blob/4fbbfff2a3c625f8e6929e5a09e2cf7b739ffe11/packages/commons/src/index.ts#L98-L100
And then modify it to the following to use the global Symbol registry.
return typeof Symbol !== 'undefined' ? Symbol.for(name) : name
Or modifying the function to use a closure, such that the Symbol is created in the context of the originating scope and not the scope of the service.ts
I didn't know that Symbol.for
was a thing. That's probably exactly what is needed here - though it's still kind of strange that the module that both of those libraries are dependent on seem to get executed twice. I'd be fine with a PR that uses Symbol.for
.
Steps to reproduce
Possible Root Cause
The error is caused by an empty
options
object here: https://github.com/feathersjs/feathers/blob/4fbbfff2a3c625f8e6929e5a09e2cf7b739ffe11/packages/express/src/rest.ts#L65-L66 This is returned by thegetServiceOptions
function, which is pretty straightforward: https://github.com/feathersjs/feathers/blob/4fbbfff2a3c625f8e6929e5a09e2cf7b739ffe11/packages/feathers/src/service.ts#L38-L40It does a property check on the service for a SYMBOL('@feathersjs/service').
https://github.com/feathersjs/feathers/blob/4fbbfff2a3c625f8e6929e5a09e2cf7b739ffe11/packages/feathers/src/service.ts#L5
When I inspect in debugger, the data is there, but the SYMBOL is different from what was set as a property and what is being checked.
I've tried legacy bundling, but that didn't work either. I suspect that the SYMBOL is being created in different contexts, and therefore doesn't reference the same object. Seems like there's a dependency injection/inversion here from the express lib that could resolve this, but I don't fully understand the benefit of the SYMBOL usage.
Any guidance?
How this was discovered.
I'm trying to setup automated testing across multiple Feathers libraries that currently work in 4 and need to be extended to 5. Creating multiple branches for testing felt like an ugly solution since it would require a lot of pipeline revisions and tie the semVer of the library to the Feathers versions. I explored
npm overrides
,npm aliases
, andlegacy-bundling=true
to see if I could deduce the reason the SYMBOL was different in the express function.Expected behavior
Dove Express should return a normal response even when aliasing the libraries.
Actual behavior
Dove Express throws an error related to unreferenced SYMBOL
System configuration
Tell us about the applicable parts of your setup.
Module versions @feathersjs/feathers@^5.0.0-pre.38 @feathersjs/express@^5.0.0-pre.38
NodeJS version:
Operating System:
Browser Version:
React Native Version:
Module Loader: