Как сохранить тело запроса в GridFS с помощью сервера Restify? - PullRequest
0 голосов
/ 24 января 2019

Невозможно сохранить файл, размер которого превышает размер фрагмента канала (~ 64 КБ).

При использовании mongodb 3.4.0, соответствующие зависимости узлов

  • restify 4.2.0
  • mongodb ^ 2.2.12
  • lodash 4.16.6

    bookeeppingData = {request, id, ...meta}
    clone = lodash.cloneDeep(bookkeepingData)
    
    const {
        request: req,
        id: _id,
        meta: metadata,
    } = clone
    
    const bucket = new mongodb.GridFSBucket(                                                                                                                                                      
        db,                                                                                                                                                                               
        {bucketName: 'my_gridfs_collection'}                                                                                                                                                          
    );                                                                                                                                                                                    
    
    const uploadSteam = bucket.openUploadStreamWithId(                                                                                                                                    
        _id,                                                                                                                                                                              
        undefined,                                                                                                                                                                        
        {metadata}                                                                                                                                                                        
    );                                                                                                                                                                                    
    
    req.on('data', (chunk) => {                                                                                                                                                        
        console.log(`Received ${chunk.length} bytes of data.`);                                                                                                                         
    });                                                                                                                                                                                   
    
    req.on('end', () => {                                                                                                                                                              
        console.log('There will be no more data.');                                                                                                                                       
    });                                                                                                                                                                                   
    
    req.on('error', (e) => {                                                                                                                                                           
        console.log('req on error', e);                                                                                                                                                   
    });                                                                                                                                                  
    
    uploadSteam.on('finish', function() {                                                                                                                                                 
        console.log('finsish');
        keepThebooks(bookkeepingData);                                                                                                                                                                                                                                                                                                                      
    });   
    
    uploadSteam.on('error', (e) => {                                                                                                                                                      
        console.log('uploadstream on error', e);                                                                                                                                          
    });                                                                                                                                                                                   
    
    req.pipe(uploadSteam);                                                                                                                                                             
    

    }

При отправке файла размером менее ~ 64K,Вывод консоли

Received 57259 bytes of data.
There will be no more data.
finish

Это соответствующий вывод curl --verbose (минус ответ json):

*   Trying ::1...                                                                                                                                                                             
* TCP_NODELAY set                                                                                                                                                                             
* Connected to localhost (::1) port 8060 (#0)                                                                                                                                                 
* Server auth using Basic with user 'driver'                                                                                                                                                  
> POST /artifact?branch=xyz&role=PHOTO&where.lat=55&where.long=77.2&where.acc=12&sys=system&id=1234&sys=system2&id=1234b&created=2018-11-01T18:41:50.850Z&tz=-600 HTTP/1.1                    
> Host: localhost:8060                                                                                                                                                                        
> Authorization: Basic xxxxxxxxx                                                                                                                                                   
> User-Agent: curl/7.61.1                                                                                                                                                                     
> Accept: */*
> Content-Type: image/png
> Content-Length: 57259
> Expect: 100-continue
>
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Cache-Control: no-cache, no-store, must-revalidate
< Content-Type: application/json
< Content-Length: 388
< Date: Wed, 23 Jan 2019 20:58:16 GMT
< Connection: keep-alive
<
* Connection #0 to host localhost left intact

При отправке файла размером больше ~ 64K вывод консолиis:

Received 65536 bytes of data.

(Вот и все - без ошибок)

Соответствующий вывод curl --verbose:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8060 (#0)
* Server auth using Basic with user 'driver'
> POST /artifact?branch=xyz&role=PHOTO&where.lat=55&where.long=77.2&where.acc=12&sys=system&id=1234&sys=system2&id=1234b&created=2018-11-01T18:41:50.850Z&tz=-600 HTTP/1.1
> Host: localhost:8060
> Authorization: Basic xxxxxxxxx
> User-Agent: curl/7.61.1
> Accept: */*
> Content-Type: image/png
> Content-Length: 84801
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server

Я ожидал, что это сработает, идля консоли должно быть что-то вроде:

Received 65536 bytes of data.
Received 19274 bytes of data.
There will be no more data.
finish

1 Ответ

0 голосов
/ 06 февраля 2019

Я в одной команде. Оказывается, мы глубоко клонировали объект, содержащий поток. Когда мы прекратили клонирование, весь файл загружался нормально.

...