我有一个multer多上传表单,然后我使用Cloud Vision api处理图像,对OCR结果执行一些处理,我想在处理完所有文件后重定向到另一个路径(/ next2)。 / p>
我用async.forEach编辑了我的代码,但我得到了一个
TypeError: Cannot read property '0' of undefined
我错了什么?
app.post('/vision/upload', upload.array("photos", 10), function(req, res) {
async.forEach(req.files, function (file, cb) {
var post = {url: file.location};
connection.query('SET FOREIGN_KEY_CHECKS=0;', function (err) {
if (err) throw err;
});
connection.query('SELECT * FROM documents WHERE documents.url = ?', file.location, function (err, res54) {
var o2 = isEmpty(res54);
var m9 = {};
if (o2) {
connection.query('INSERT INTO documents SET ?', post, function (err, res5) {
if (err) throw err;
DocumentsNextPage.push(res5.insertId);
});
} else {
connection.query('SELECT * FROM documents WHERE documents.url = ?', file.location, function (err, res9) {
m9 = res9;
});
connection.query('UPDATE documents SET ? WHERE ?', [{url: file.location}, {url: file.location}], function (err) {
if (err) throw err;
DocumentsNextPage.push(m9[0].id);
});
}
if (err) throw err;
});
const req2 = new vision.Request({
image: new vision.Image({
url: file.location
}),
features: [
new vision.Feature('DOCUMENT_TEXT_DETECTION', 10),
]
});
DocumentsNextPage.length = 0;
vision.annotate(req2).then((res2) => {
p1 = JSON.stringify(res2.responses);
p1up = p1.toUpperCase();
x7 = res2.responses[0].textAnnotations;
console.log(x7);
})
occurrencesText = new Occurrences(p1up, {ignored: arrayIgnoredWords});
var tt1 = occurrencesText.getSorted();
var oc1 = toArray(tt1);
var oc2 = unique(oc1);
for (var i = 0; i < 10; i++) {
occurencesResults.push(oc2[i][0]);
var postOccu = {name: oc2[i][0], active: 0, isOccurenceMeta: 1, url: file.location};
connection.query('REPLACE INTO metas SET ?', postOccu, function (err) {
if (err) throw err;
});
}
connection.query(queryString, function (err, rows, fields) {
if (err) throw err;
for (var i in rows) {
var fuse = new Fuse(x7, options);
var result = fuse.search(rows[i].name);
var t1 = isEmpty(result);
if (t1) {
} else {
arrayResults.push(rows[i].name);
var posTag0 = {name: [rows[i].name], active: 0, isOccurenceMeta: 0, url: file.location};
connection.query('INSERT INTO metas SET ?', posTag0, function (err) {
if (err) throw err;
});
}
}
connection.query('SELECT * FROM documents INNER JOIN metas ON documents.url = metas.url WHERE metas.url = ? GROUP BY metas.name ORDER BY documents.url DESC', file.location, function (err, res99) {
if (err) throw err;
for (var i in res99) {
if (res99[i].id != undefined) {
resultMetasDocs[i] = {'documents_id': res99[i].id, 'metas_id': res99[i].id_meta};
}
}
});
for (var i in resultMetasDocs) {
var documentHasMetas = resultMetasDocs[i];
connection.query('REPLACE INTO documents_has_metas SET ?', documentHasMetas, function (err) {
if (err) throw err;
});
}
})
})
cb();
}, function () {
res.redirect('/next2');
});
答案 0 :(得分:0)
几个问题:
var m9 = {};
您已将m9
定义为对象,但您稍后尝试访问其成员,就好像它是一个数组一样。确保m9具有您尝试访问的属性,并且是正确的type
。
connection.query('SELECT * FROM documents WHERE documents.url = ?', file.location, function (err, res9) {
m9 = res9;
});
connection.query('UPDATE documents SET ? WHERE ?', [{url: file.location}, {url: file.location}], function (err) {
if (err) throw err;
DocumentsNextPage.push(m9[0].id);
});`
您可能正在尝试从另一个回调中的一个异步操作中访问结果,该回调不知道应该获得该结果的异步操作的状态。
connection.query('SELECT * FROM documents WHERE documents.url = ?',
file.location, function (err, res9) {
m9 = res9;
connection.query('UPDATE documents SET ? WHERE ?', [{url:
file.location}, {url: file.location}], function (err) {
if (err) throw err;
/*
because this callback is inside the callback of the former
operation, we can be sure that we will have access to the
results from that operation `m9` in this case
*/
DocumentsNextPage.push(m9[0].id);
});
});