Add workaround for loopback#643
Merged
Merged
Conversation
rochdev
approved these changes
Aug 9, 2019
rochdev
pushed a commit
that referenced
this pull request
Aug 26, 2019
* Add reference to original handler
BridgeAR
added a commit
that referenced
this pull request
Jun 25, 2026
This makes sure loopback's phase-based middleware sorting keeps working under
tracing. loopback's `_findLayerByHandler` maps an express layer back to the
user handler by scanning the layer handle's enumerable properties, then tags
the layer with its phase. Replacing `layer.handle` with the tracing wrapper hid
the original handler, so the lookup failed, the layer kept no phase, and an
`app.middleware('final', ...)` handler ran in insertion order ahead of the
route handlers instead of last. Restoring the `_datadog_orig` back-reference
that the router instrumentation rewrite dropped lets the lookup succeed again.
Refs: #643
* test(express): run the silently-skipped loopback suite
1. The block passed the plugin export to `withVersions` instead of the
`'express'` integration name, so no installed version matched and the suite
never ran. Switching to the name runs it.
2. Legacy loopback emits the deprecated `util._extend` warning at module load,
which the harness deprecation guard turns into a thrown error; allowlist that
one message so the modules load.
dd-octo-sts Bot
pushed a commit
that referenced
this pull request
Jun 26, 2026
This makes sure loopback's phase-based middleware sorting keeps working under
tracing. loopback's `_findLayerByHandler` maps an express layer back to the
user handler by scanning the layer handle's enumerable properties, then tags
the layer with its phase. Replacing `layer.handle` with the tracing wrapper hid
the original handler, so the lookup failed, the layer kept no phase, and an
`app.middleware('final', ...)` handler ran in insertion order ahead of the
route handlers instead of last. Restoring the `_datadog_orig` back-reference
that the router instrumentation rewrite dropped lets the lookup succeed again.
Refs: #643
* test(express): run the silently-skipped loopback suite
1. The block passed the plugin export to `withVersions` instead of the
`'express'` integration name, so no installed version matched and the suite
never ran. Switching to the name runs it.
2. Legacy loopback emits the deprecated `util._extend` warning at module load,
which the harness deprecation guard turns into a thrown error; allowlist that
one message so the modules load.
IlyasShabi
pushed a commit
that referenced
this pull request
Jun 26, 2026
This makes sure loopback's phase-based middleware sorting keeps working under
tracing. loopback's `_findLayerByHandler` maps an express layer back to the
user handler by scanning the layer handle's enumerable properties, then tags
the layer with its phase. Replacing `layer.handle` with the tracing wrapper hid
the original handler, so the lookup failed, the layer kept no phase, and an
`app.middleware('final', ...)` handler ran in insertion order ahead of the
route handlers instead of last. Restoring the `_datadog_orig` back-reference
that the router instrumentation rewrite dropped lets the lookup succeed again.
Refs: #643
* test(express): run the silently-skipped loopback suite
1. The block passed the plugin export to `withVersions` instead of the
`'express'` integration name, so no installed version matched and the suite
never ran. Switching to the name runs it.
2. Legacy loopback emits the deprecated `util._extend` warning at module load,
which the harness deprecation guard turns into a thrown error; allowlist that
one message so the modules load.
pabloerhard
pushed a commit
that referenced
this pull request
Jun 26, 2026
This makes sure loopback's phase-based middleware sorting keeps working under
tracing. loopback's `_findLayerByHandler` maps an express layer back to the
user handler by scanning the layer handle's enumerable properties, then tags
the layer with its phase. Replacing `layer.handle` with the tracing wrapper hid
the original handler, so the lookup failed, the layer kept no phase, and an
`app.middleware('final', ...)` handler ran in insertion order ahead of the
route handlers instead of last. Restoring the `_datadog_orig` back-reference
that the router instrumentation rewrite dropped lets the lookup succeed again.
Refs: #643
* test(express): run the silently-skipped loopback suite
1. The block passed the plugin export to `withVersions` instead of the
`'express'` integration name, so no installed version matched and the suite
never ran. Switching to the name runs it.
2. Legacy loopback emits the deprecated `util._extend` warning at module load,
which the harness deprecation guard turns into a thrown error; allowlist that
one message so the modules load.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
This PR adds a workaround to support the
loopbacklibrary. Sinceloopbacktries to find theexpresslayers by comparinghandlerfunctions, it can't find the layers since we wrap thehandlers. This causes therouterstack to be filled with entries that are un-sortable. This is an issue because adding a new layer will cause the layer to be put at the bottom of the stack, below theraiseUrlNotFoundErrorlayer, even after sorting. That means requests will throw a 404 error even though the route is properly registered.This PR makes use of
loopback's aggressive search for the originalhandlefunction by adding a reference to the originalhandlefunction.Motivation
Support loopback.