You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Exception: Call to Node module failed with error: Error:
When running outside the browser (e.g., in Node.js), you must specify a base URL
before invoking domain-task's 'fetch' wrapper.
Example:
import { baseUrl } from 'domain-task/fetch';
baseUrl('http://example.com'); // Relative URLs will be resolved against this
If you want server-side prerendering to wait for your chain of promises to complete, then you must add the outer promise to the list of domain tasks, like the WeatherForecasts.ts example does in the ReactRedux template.
For example,
import{fetch,addTask}from'domain-task';
... and then...
constmyTask=fetch('https://jsonplaceholder.typicode.com/posts/1').then(response=>response.json()).then(response=>{returnfetch('https://jsonplaceholder.typicode.com/posts/2').then(response2=>response2.json())});addTask(myTask);// Here's where we register this task so that prerendering waits for itreturnmyTask;
This should keep the domain context open for as long as your promise chain is in flight, so it should not clear out the baseUrl context data before it's finished.
@SteveSandersonMS Would you mind making addTask return the task fluently as then we can condense code like the above (of which I have a fair amount) to return addTask(myTask);
Great use case for using async await too, although not sure on the projects policy on that.
Reacted by Sławomir Rosiek, Kraig Walker and Dmitry Panyushkin
I just made another test - I replaced first fetch with: const delay = timeout => new Promise((resolve, reject) => setTimeout(resolve, timeout));
and it also failed.
It looks like baseUrl() doesn't work with promises in general.
I think the behavior reported here comes down to a Node issue whereby it fails to preserve domain context in native Promise continuations. That's not something we can directly fix, so if you're chaining promises and using addTask, I think you'll unfortunately have to re-assign the baseUrl at the start of each continuation (e.g., by calling baseUrl('http://example.com')).
@mkArtakMSFT Propose we close this as it's an external (Node) bug that we're not planning to work around.
Activity
SteveSandersonMS commentedon May 2, 2017
If you want server-side prerendering to wait for your chain of promises to complete, then you must add the outer promise to the list of domain tasks, like the
WeatherForecasts.tsexample does in the ReactRedux template.For example,
... and then...
This should keep the domain context open for as long as your promise chain is in flight, so it should not clear out the
baseUrlcontext data before it's finished.rosieks commentedon May 2, 2017
I was aware of
addTaskfromWeatherForecasts.ts- I have made a few other tests and I noticed that:addTaskthe error show up in Visual Studio output window but the page is properly displayed in browser.addTaskthen I see that error in browser as a error page.rosieks commentedon May 4, 2017
@SteveSandersonMS - I have published example that shows this issue. To reproduce that:
npm installdotnet runSteveSandersonMS commentedon May 4, 2017
@rosieks Thanks - I'll check it soon. Reopening.
DanHarman commentedon May 5, 2017
@SteveSandersonMS Would you mind making
addTaskreturn the task fluently as then we can condense code like the above (of which I have a fair amount) toreturn addTask(myTask);Great use case for using async await too, although not sure on the projects policy on that.
rosieks commentedon Jun 12, 2017
I just made another test - I replaced first fetch with:
const delay = timeout => new Promise((resolve, reject) => setTimeout(resolve, timeout));and it also failed.
It looks like
baseUrl()doesn't work with promises in general.Maybe replacing it to async/await will help?
exera commentedon Aug 1, 2017
any workaround for this? it looks like when nested fetch is called there is no active domain and baseUrl returns undefined.
SteveSandersonMS commentedon Jan 16, 2019
Sorry this never got a timely response.
I think the behavior reported here comes down to a Node issue whereby it fails to preserve domain context in native Promise continuations. That's not something we can directly fix, so if you're chaining promises and using
addTask, I think you'll unfortunately have to re-assign thebaseUrlat the start of each continuation (e.g., by callingbaseUrl('http://example.com')).@mkArtakMSFT Propose we close this as it's an external (Node) bug that we're not planning to work around.