首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql和节点async.waterfall

Mysql和节点async.waterfall
EN

Stack Overflow用户
提问于 2015-06-04 10:58:17
回答 1查看 2.4K关注 0票数 0

我试图找出记录是否存在于我的数据库表中。如果它不存在,那么我想将它添加到我的数据库中。我使用节点和async.waterfall。但是我的代码出了问题,我找不到什么。它不会将记录添加到我的数据库中。有什么建议吗?

代码语言:javascript
复制
var mysql       = require('mysql');
var connection  = mysql.createConnection({
  host     : 'localhost',
  user     : 'user',
  password : 'password',
  database : 'database'
});


for (var m = 0; m <= (urls.length-1); m++) {
     var Myurl = urls[m];
     var ThisName= TheNames[m];

     //IIFE function. I omitted the error handling for clarity.

     (function(Myurl,ThisName){

        async.waterfall([

          //First find out if the record exists in mydata
          function(next){
          connection.query('SELECT * FROM mydata WHERE UrlLink=?   
                            LIMIT 1',[Myurl],next)
                        },

          //If the record does not exist, put it in mydata
          function(results,next){
          if (results.length==false){
              console.log("New Thing!");
              //Do some stuff here, request(Myurl...) to find TableName.
              var post  = {UniqueUrl:Myurl,ThingName:ThisName,TheName:TableName};
              connection.query('Insert INTO mydata Set ?', post,next);
                                    };
                                };
                         ],

          //Final callback
          function(err, results) {
          connection.end();
                                 };
                       );
     })(Myurl,ThisName);
   };

EDIT

我在建议的答案TypeError: object is not a function ( if statement中的return next()行)中出现了一个错误。在我的实际代码中,我实际上做了类似的事情(当我使用建议的答案时):

代码语言:javascript
复制
async.series([
  //First function
  function(callback){
    //Some calculations...
    callback();
 },
  //Next function
  function(callback){
       var i = 0;
       //Loop
       async.whilst(
       function() { return i <= thefooz.length-1; },
       //The innerCallback:
       function(innerCallback){
       //Some calculations where i get urls and TheNames.
async.forEachOf(urls, function(Myurl, m, eachDone) {
  var ThisName = TheNames[m];

  async.waterfall([
    function(next) {
      connection.query(
        'SELECT * FROM mydata WHERE UrlLink=? LIMIT 1',
        [ Myurl ],
        next
      );
    },
    function(results, next) {
      if (results.length !== 0) {
        return next();
      }
      console.log("New Thing!");
      //Do some stuff here, request(Myurl...) to find TableName.
      var post = {
        UniqueUrl : Myurl,
        ThingName : ThisName,
        TheName   : TableName
      };
      connection.query('Insert INTO mydata Set ?', post, next);
    }
  ], eachDone);

}, function(err) {
  if (err) throw err; // or however you like to handle errors
  connection.end();
});
setTimeout(function() { i++; innerCallback(); }, 10000);
}); //close my calculations in innerCallback.
     }, //close innerCallback.

    ); //close asyns.whilst
callback;
   } //close function(callback)

      ], function(error){
        if (error) return next(error);

      });

我真的被困在callback hell了..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-04 13:57:25

一个(未经测试的)版本也应该这样做,但在更多地利用async的优点方面有一些缺陷和增强:

代码语言:javascript
复制
var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'user',
  password : 'password',
  database : 'database'
});

// Process all url's in parallel (at the same time). If you to process them
// sequentially (one after another), you can use `async.forEachOfSeries()`
// instead. Or, if you want to limit the number of parallel requests, use
// `async.forEachOfLimit()`.

async.forEachOf(urls, function(Myurl, m, eachDone) {
  var ThisName = TheNames[m];

  async.waterfall([
    function(next) {
      connection.query(
        'SELECT * FROM mydata WHERE UrlLink=? LIMIT 1',
        [ Myurl ],
        next
      );
    },
    function(results, fields, next) {
      if (results.length !== 0) {
        return next();
      }
      console.log("New Thing!");
      //Do some stuff here, request(Myurl...) to find TableName.
      var post = {
        UniqueUrl : Myurl,
        ThingName : ThisName,
        TheName   : TableName
      };
      connection.query('Insert INTO mydata Set ?', post, next);
    }
  ], eachDone);

}, function(err) {
  if (err) throw err; // or however you like to handle errors
  connection.end();
});

不使用forEach*,也可以使用each*,但是由于需要数组索引,forEach*更方便。

相关文件:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30642055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档