0

我正在尝试使用 Node.js watson-developer-cloud JDK 将 JSON 文档插入到 Discovery 集合中。这是相关代码:

var DiscoveryV1=require('watson-developer-cloud/discovery/v1');
var discovery=new DiscoveryV1(credentials);

let doc=aSmallValidJsonObject;
let parms={
  environment_id: envID,
  collection_id: collID,
  configuration_id: confID,
  file: {
        value: new Buffer(JSON.stringify(doc)),
        options:{
          contentType:'application/json',
          "Content-Type":'application/json' //just to be sure
        }
     }
  };
discovery.addDocument(parms,
  function(err,results)
    {
    if (err) {...

此调用返回的错误是

"Error: Request must specify either a "metadata" or "file" part"

我也试过用这种方式制作parms

let parms={
  environment_id: envID,
  collection_id: collID,
  configuration_id: confID,
  metadata:{"Content-Type":"application/json"},
  file:new Buffer(JSON.stringify(doc))
  };

在这种情况下我得到的错误是

[TypeError: source.on is not a function]

(我将此错误追溯到库延迟流.js中的第 33 行)

如果我在上述参数中将元数据字段设为字符串(即,将值括在单引号中),则会收到此错误:

Error: The Media Type [application/octet-stream] of the input document is not supported. Auto correction was attempted, but the auto detected media type [text/plain] is also not supported. Supported Media Types are: application/json, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/pdf, text/html, application/xhtml+xml

有人能告诉我这个函数的正确语法是什么吗?

4

2 回答 2

0

我在使用 watson-developer-cloud SDK 以及在没有 SDK 的情况下直接发布到 API 时遇到了同样的问题。我可以让它工作的唯一方法是忽略文件并将我的文档内容作为元数据的一部分直接发送到 API(使用请求包的示例)。

var options = {
    uri:'https://gateway.watsonplatform.net/discovery/api/v1/environments/'+process.env.DISCOVERY_ENVIRONMENT_ID+'/collections/'+process.env.DISCOVERY_COLLECTION_ID+'/documents?version=2016-12-01&configuration_id='+process.env.DISCOVERY_CONFIGURATION_ID,
    method: 'POST',
    formData: {
        metadata: {
            doc: JSON.stringify(doc)
        }
    },
    auth: {
       user: process.env.DISCOVERY_USERNAME,
       pass: process.env.DISCOVERY_PASSWORD
    },
};

request(options, function(err, httpResponse, body){
    if(err){
      console.log(err);
    }
    console.dir(body);
});

然后,您需要配置您的集合以使用元数据中的文档进行任何扩充,并记住查询元数据。

于 2017-07-02T19:39:28.077 回答
0

fs如果您想在您的计算机 HD 中发送一个文档,则需要 FileSystem ( ) 库才能正确发送文档。该错误似乎无法识别您选项中的标题。试试官方的例子或者我的例子:

官方 API 参考显示了一个 addDocument 示例,例如:

var DiscoveryV1 = require('watson-developer-cloud/discovery/v1');
var fs = require('fs');

var discovery = new DiscoveryV1({
  username: '{username}',
  password: '{password}',
  version_date: '2017-06-25'
});

var file = fs.readFileSync('{/path/to/file}');

discovery.addDocument(('{environment_id}', '{collection_id}', file),
function(error, data) {
  console.log(JSON.stringify(data, null, 2));
});

以你的例子:

discovery.addDocument({
    environment_id: yourEnvId,
    collection_id: yourCollId,
    metadata:'{"Content-Type":"application/json"}',
    file: Buffer.from(doc)
}, function(err, data) {
    if (err) {
        return next(err);
    } else {
        return res.json(data)
      }
});
于 2017-07-07T18:08:30.527 回答