Я намагаюся вставити документи JSON у колекцію Discovery за допомогою Node.js watson-developer-cloud-хмара JDK. Це відповідний код:
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"
Я також спробував зробити парм сюди:
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]
(Я простежив цю помилку до рядка 33 у бібліотеці delayed_stream.js)
Якщо я зроблю метадані поле рядка (тобто додайте значення в одиничні лапки) у вищезгаданих пармах, я отримую цю помилку:
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
Хтось може сказати мені, що правильний синтаксис для цієї функції?
Відповіді:
0 для відповіді № 1У мене були ті ж проблеми зwatson-developer-хмара SDK і при публікації безпосередньо в API без SDK. Єдиний спосіб, коли я міг би змусити його працювати, - це ігнорування файлу та надсилання вмісту документу як частини метаданих безпосередньо до 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);
});
Потім потрібно налаштувати свою колекцію, щоб використовувати документ у метаданих для будь-якого збагачення та пам’ятати, що запити проти метаданих.
0 для відповіді № 2
Потрібна файлова система (fs
) бібліотека, щоб правильно відправити документ, якщо вихочете надіслати одного документа всередині комп'ютера HD. Помилка здається, що заголовок у ваших параметрах не визнається. Спробуйте офіційний приклад чи мій приклад:
Офіційний довідник 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)
}
});