I need your help with a problem concerning the Forge Autodesk Viewer I'm developping, based on this tutorial. The viewer includes a feature to create buckets, and this feature is not working on my version of the viewer because the POST request to create the bucket contains no body.
The bucket creation feature is fully functionnal on the tutorial viewer, and I based my code on this one. I'm pretty new at this, so if I miss some essential parts, I'll provide them as soon as possible !
The bucket creation code, client-side :
function createNewBucket() {
var bucketKey = $('#newBucketKey').val();
var policyKey = $('#newBucketPolicyKey').val();
console.log(bucketKey)
jQuery.post({
url: '/api/forge/oss/buckets',
contentType: 'application/json',
data: JSON.stringify({ 'bucketKey': bucketKey, 'policyKey': policyKey }),
success: function (res) {
$('#appBuckets').jstree(true).refresh();
$('#createBucketModal').modal('toggle');
},
error: function (err) {
if (err.status == 409)
alert('Bucket already exists - 409: Duplicated')
console.log(err);
}
});
}
The bucket-creation code, server-side :
// POST /api/forge/oss/buckets - creates a new bucket.
// Request body must be a valid JSON in the form of { "bucketKey": "<new_bucket_name>" }.
router.post('/buckets', async (req, res, next) => {
let payload = new PostBucketsPayload();
console.log(req)
payload.bucketKey = config.credentials.client_id.toLowerCase() + '-' + req.body.bucketKey;
payload.policyKey = 'transient'; // expires in 24h
try {
// Create a bucket using [BucketsApi](https://github.com/Autodesk-Forge/forge-api-nodejs-client/blob/master/docs/BucketsApi.md#createBucket).
await new BucketsApi().createBucket(payload, {}, req.oauth_client, req.oauth_token);
res.status(200).end();
} catch(err) {
next(err);
}
});
The expected request (as displayed on VSCode, from the working code) :
IncomingMessage {_readableState: ReadableState, readable: false, _events: Object, _eventsCount: 1, _maxListeners: undefined, …}
oss.js:60
_body:true
_consuming:true
_dumped:false
_events:Object {end: }
_eventsCount:1
_maxListeners:undefined
_parsedUrl:Url {protocol: null, slashes: null, auth: null, …}
_readableState:ReadableState {objectMode: false, highWaterMark: 16384, buffer: BufferList, …}
[[StableObjectId]]:1
aborted:false
baseUrl:"/api/forge/oss"
body:Object {bucketKey: "buckettest"}
client:Socket {connecting: false, _hadError: false, _handle: null, …}
complete:true
connection:Socket {connecting: false, _hadError: false, _handle: null, …}
destroyed:false
fresh:false
headers:Object {host: "localhost:3001", user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0)…", accept: "*/*", …}
host:"localhost"
hostname:"localhost"
httpVersion:"1.1"
httpVersionMajor:1
httpVersionMinor:1
ip:undefined
ips:Array(0)
length:undefined
method:"POST"
next:function next(err) { … }
oauth_client:OAuth2TwoLegged {authentication: Object, authName: "oauth2_application", clientId: "rt2DhnuChgIIEX3GhnGyeISPS9Vzoh3p", …}
oauth_token:Object {access_token: "eyJhbGciOiJIUzI1NiIsImtpZCI6Imp3dF9zeW1tZXRyaWNfa2…", token_type: "Bearer", expires_in: 3599, …}
originalUrl:"/api/forge/oss/buckets"
params:Object {}
path:"/buckets"
protocol:"http"
query:Object {}
rawHeaders:Array(22) ["Host", "localhost:3001", "User-Agent", …]
rawTrailers:Array(0) []
readable:false
readableBuffer:BufferList
readableFlowing:true
readableHighWaterMark:16384
readableLength:0
res:ServerResponse {_events: Object, _eventsCount: 1, _maxListeners: undefined, …}
route:Route {path: "/buckets", stack: Array(1), methods: Object}
secure:false
socket:Socket {connecting: false, _hadError: false, _handle: null, …}
stale:true
statusCode:null
statusMessage:null
subdomains:Array(0)
[[StableObjectId]]:2
length:0
__proto__:Array(0) [, …]
trailers:Object {}
upgrade:false
url:"/buckets"
xhr:true
__proto__:IncomingMessage {app: }
The actual request (as displayed on VSCode, from the non-working code) :
IncomingMessage {_readableState: ReadableState, readable: true, _events: Object, _eventsCount: 1, _maxListeners: undefined, …}
oss.js:61
_consuming:false
_dumped:false
_events:Object {end: }
_eventsCount:1
_maxListeners:undefined
_parsedUrl:Url {protocol: null, slashes: null, auth: null, …}
_readableState:ReadableState {objectMode: false, highWaterMark: 16384, buffer: BufferList, …}
[[StableObjectId]]:1
aborted:false
baseUrl:"/api/forge/oss"
client:Socket {connecting: false, _hadError: false, _handle: TCP, …}
complete:true
connection:Socket {connecting: false, _hadError: false, _handle: TCP, …}
destroyed:false
fresh:false
headers:Object {host: "localhost:3000", user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0)…", accept: "*/*", …}
host:"localhost"
hostname:"localhost"
httpVersion:"1.1"
httpVersionMajor:1
httpVersionMinor:1
ip:"::1"
ips:Array(0)
method:"POST"
next:function next(err) { … }
oauth_client:OAuth2TwoLegged {authentication: Object, authName: "oauth2_application", clientId: "rt2DhnuChgIIEX3GhnGyeISPS9Vzoh3p", …}
oauth_token:Object {access_token: "eyJhbGciOiJIUzI1NiIsImtpZCI6Imp3dF9zeW1tZXRyaWNfa2…", token_type: "Bearer", expires_in: 3599, …}
originalUrl:"/api/forge/oss/buckets"
params:Object {}
path:"/buckets"
protocol:"http"
query:Object {}
rawHeaders:Array(22) ["Host", "localhost:3000", "User-Agent", …]
rawTrailers:Array(0) []
readable:true
readableBuffer:BufferList
readableFlowing:null
readableHighWaterMark:16384
readableLength:27
res:ServerResponse {_events: Object, _eventsCount: 1, _maxListeners: undefined, …}
route:Route {path: "/buckets", stack: Array(1), methods: Object}
secure:false
socket:Socket {connecting: false, _hadError: false, _handle: TCP, …}
stale:true
statusCode:null
statusMessage:null
subdomains:Array(0)
trailers:Object {}
upgrade:false
url:"/buckets"
xhr:true
__proto__:IncomingMessage {app: }
The error message (as displayed on VSCode) :
(node:15636) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'bucketKey' of undefined
[...]
(node:15636) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
warning.js:18
(node:15636) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Since your request's readable
property is true
, it's possible that the express application hasn't parsed its body yet. Make sure to setup the JSON parsing middleware as shown on this line in the tutorial. With this middleware, your express app will automatically read the body of any incoming request with Content-Type: application/json
.