Nodejs表示异步foreach calback以重定向到另一个路由

时间:2017-07-19 15:28:48

标签: node.js express async-await google-cloud-vision

我有一个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');
    });

1 个答案:

答案 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);
  });
});