我正在使用IBM Cloudant NoSQL数据库,我正在尝试在Node.js上传文档。首先读入文档(.xlsx)并将其转换为json:
xlsxj({
input: "testdata/WHO_NREVSS.xlsx",
output: "testdata/WHO_NREVSS.json"
}, function(err, result) {
if(err) {
console.error(err);
}else {
// Read the file and send to the callback
fs.readFile('./testdata/WHO_NREVSS.json', handleFile)
//The callback function
function handleFile(err, data) {
if (err) throw err
else{
//data = data.replace( "\"", '\\"');
obj = JSON.parse(data);
到目前为止一切正常。当我在console.log obj时,我得到一个充满json数据的数组:
[
{
"H3N2v": "0",
"REGION TYPE": "Census Regions",
"REGION": "New England",
"YEAR": "2007",
"WEEK": "40",
"timeline": "2007-40",
"TOTAL SPECIMENS": "115",
"PERCENT POSITIVE": "0",
"A (H1)": "0",
"A (Unable to Subtype)": "0",
"A (H3)": "0",
"2009 H1N1": "0",
"A (Subtyping not Performed)": "0",
"B": "0"
},...
]
现在,当我想在Cloudant上的文档中插入此数组时,看起来像这样......:
testdb.insert({"_id": "statistic", "data":obj}, function(error, result){
if(error) {
console.error(error);
}else {
console.log(JSON.stringify(obj));
}
})
...我只得到一个带有“_id”和“_rev”的文档,但键“data”和值“obj”根本没有出现。为什么会这样? 当我手动(通过复制 - 粘贴)将数组插入cloudant时,它可以正常工作。
更新1: 当使用回调函数handleFile中的“data”时,我实际上在数据库中得到了一个结果,但它看起来像这样:
"data": [
91,
123,
34,
72,
51,
78,
...
]
虽然不应该。记录它给我的结果是“Buffer 5b 7b 22 48 33 ......”
解
通过在回调函数中移动整个'insert'部分来解决问题。现在它的工作方式应该有效。最终代码:
fs.readFile('./testdata/WHO_NREVSS.json', handleFile)
// Write the callback function
function handleFile(err, data) {
if (err) throw err
else{
obj = JSON.parse(data);
testdb.insert({"_id": "statistic", "data":obj}, function(error, result){
if(error) {
console.error(error);
}else {
console.log(obj);
}
})