cloudant couchdb multipart insert throw function_clause错误

时间:2018-04-17 08:51:27

标签: node.js couchdb cloudant couchdb-nano

我正在尝试使用下面的代码将媒体文档插入cloudant couchdb。

var uuid = require('uuid').v4;

fs.readFile('./test.jpeg', function(err, data) {
    if (!err) {
        var newAttachmentObj = { 
            type: 'media',
            media_mime: 'image/jpeg',
            media_type: 'Photo',
            media_filename: 'rabbit1'
        }

        var filename = 'rabbit1';
        var media_mime =  'image/jpeg';
        var attachment_id = uuid();
        var media_data = data;
        console.log(data);
        console.log(newAttachmentObj);
        console.log(attachment_id);

        db.multipart.insert(newAttachmentObj,
            [{ name: filename, data: media_data, content_type: media_mime }], attachment_id, function (err, body) {
            console.log(body);
            if (err) {
                console.log('Error: Creating a media doc in cloudant.');
                console.log(err);
                // console.log(JSON.stringify(err));
            } else {
                console.log(body);
            }
        })
    }
});

文档正在cloudant couchdb中创建,我们也可以查看上传的附件,但回调函数会返回错误,如下所示。

{ Error: function_clause
  at Request._callback (/home/boatman/anoop/forwarding-module/node_modules/cloudant-nano/lib/nano.js:248:15)
  at Request.self.callback (/home/boatman/anoop/forwarding-module/node_modules/request/request.js:188:22)
  at emitTwo (events.js:125:13)
  at Request.emit (events.js:213:7)
  at Request.<anonymous> (/home/boatman/anoop/forwarding-module/node_modules/request/request.js:1171:10)
  at emitOne (events.js:115:13)
  at Request.emit (events.js:210:7)
  at IncomingMessage.<anonymous> (/home/boatman/anoop/forwarding-module/node_modules/request/request.js:1091:12)
  at Object.onceWrapper (events.js:314:30)
  at emitNone (events.js:110:20)
  at IncomingMessage.emit (events.js:207:7)
  at endReadableNT (_stream_readable.js:1045:12)
  at _combinedTickCallback (internal/process/next_tick.js:138:11)
  at process._tickDomainCallback (internal/process/next_tick.js:218:9)
    name: 'Error',
    error: 'unknown_error',
    reason: 'function_clause',
    ref: 944644368,
    scope: 'couch',
    statusCode: 500,
    request: 
    { method: 'PUT',
    headers: { 'content-type': 'multipart/related' },
    uri: 'https://XXXXXX:XXXXXX@account_id-bluemix.cloudant.com/db_media/a73d3788-d661-4944-964b-bcffce0286bd',
    multipart: [ [Object], [Object] ] },
    headers: 
    { 'cache-control': 'must-revalidate',
    'content-type': 'application/json',
    date: 'Tue, 17 Apr 2018 08:37:28 GMT',
    'x-couch-request-id': '5097b3e876',
    'x-couch-stack-hash': '944644368',
    'x-frame-options': 'DENY',
    'strict-transport-security': 'max-age=31536000',
    'x-content-type-options': 'nosniff',
    'x-cloudant-request-class': 'write',
    'x-cloudant-backend': 'bm-cc-uk-04',
    via: '1.1 lb1.bm-cc-uk-04 (Glum/1.50.4)',
    statusCode: 500,
    uri: 'https://XXXXXX:XXXXXX@account_id-bluemix.cloudant.com/db_media/a73d3788-d661-4944-964b-bcffce0286bd' },
    errid: 'non_200',
    description: 'couch returned 500' }

请找到下面的图片。 Image trying to attaach

1 个答案:

答案 0 :(得分:1)

我试图用CouchDB 2.1.1重现你的条件, Cloudant,因此它可能不是一个精确的复制品,但我想我会分享我的结果。

我根据您的代码创建了以下server.js文件,稍作修改。由于我没有使用Cloudant,因此我使用了包nano for CouchDB 而不是 cloudant-nano

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; // Ignore rejection, becasue CouchDB SSL certificate is self-signed
var uuid = require('uuid').v4;
const fs = require('fs')
const nano = require('nano')('https://admin:****@192.168.1.106:6984');
// Database 'reproduce' is already created in CouchDB 2.1.1
const db = nano.db.use('reproduce');

fs.readFile('./test.jpeg', function(err, data) {
    if(err){
        console.log('err -> ', err)
    }else if (!err) {
        var newAttachmentObj = {
            type: 'media',
            media_mime: 'image/jpeg',
            media_type: 'Photo',
            media_filename: 'rabbit1'
        }

        var filename = 'rabbit1';
        var media_mime =  'image/jpeg';
        var attachment_id = uuid();
        var media_data = data;
        console.log(data);
        console.log(newAttachmentObj);
        console.log(attachment_id);

        db.multipart.insert(newAttachmentObj,
            [{ name: filename, data: media_data, content_type: media_mime }], attachment_id, function (err, body) {
                console.log(body);
                if (err) {
                    console.log('Error: Creating a media doc in cloudant.');
                    console.log(err);
                    // console.log(JSON.stringify(err));
                } else {
                    console.log(body);
                }
            })
    }
});

我将示例test.jpeg放在与我的server.js文件相同的目录中。然后我用命令$ node server.js运行代码,得到了以下结果:

$ node server.js 
<Buffer ff d8 ff e1 00 32 45 78 69 66 00 00 49 49 2a 00 08 00 00 00 01 00 98 82 02 00 0e 00 00 00 1a 00 00 00 00 00 00 00 52 61 77 70 69 78 65 6c 20 4c 74 64 ... >
{ type: 'media',
  media_mime: 'image/jpeg',
  media_type: 'Photo',
  media_filename: 'rabbit1' }
ec6a36d1-952e-4d86-9865-3587c6079fb5
{ ok: true,
  id: 'ec6a36d1-952e-4d86-9865-3587c6079fb5',
  rev: '1-896eca9e9980509aeaa8539b281c3257' }
{ ok: true,
  id: 'ec6a36d1-952e-4d86-9865-3587c6079fb5',
  rev: '1-896eca9e9980509aeaa8539b281c3257' }

显然,我收到你得到的错误。