1

jqgrid を使用してデータを挿入しています。このデータには画像も含まれます。アップロードは問題ありませんが、データと名前を変更したファイルを組み合わせてデータベースに保存するのに苦労しています。コンソールを使用して確認しようとしましたが、システムが挿入モデルを 2 回呼び出そうとしているようです。これは出力です:

console.log (content.record);

{
id: '_empty',
Logo: undefined,
Name: 'foo'
}
{
id: 'undefined',
Logo: 'public/foo.jpeg',     
Name: 'undefined'
}

// 常に 2 回挿入しようとします。おそらく for(...); が原因です。

これは、アップロードされたファイルの名前を変更し、データを含めてデータベースに保存する私のコードです..

exports.Upload = function(req,res){



        for(var i in req.files)
            var tmp_path = req.files[i].path;
        for(var i in req.files) 
        var target_path = newpath + req.files[i].name;

                fs.rename(tmp_path, target_path, function(err) {  
                fs.unlink(tmp_path, function() {

                    var content = {};
                    content.table = "teams";
                    content.record = {id:req.body.id,Logo:target_path,Name:req.body.Name};


                    //console.log(target_path);
                console.log(content.record);

                        req.model.insert(content,function(err,result){
                        result = (result?true:false);

                        });
                   });
            });
};

私の貧弱な英語でご容赦ください。どんな助けでも大歓迎です。

4

1 に答える 1

0

for非同期操作を実行するときは、標準ループを使用しないでください。代わりに async モジュールを使用してくださいasync.eachSeries

var inspect = require('eyespect').inspector();
var fs = require('fs')
var path = require('path')
var async = require('async')
exports.Upload = function (req, res) {
  var files = req.files
  async.eachSeries(
    files,
    function (file, cb) {
      var filePath = file.path
      var filename = file.filename
      var outputPath = path.join(__dirname, 'uploads/', filename)
      fs.rename(filePath, outputPath, function (err, reply) {
        if (err) { return cb(err) }
        var content = {};
        content.table = "teams";
        content.record = {
          id:req.body.id,
          logo:outputPath,
          name:
          req.body.Name
        };
        //console.log(target_path);
        console.log(content.record);
        req.model.insert(content,function(err,result){
          if (err) { return cb(err) }
          inspect(result, 'insert result')
          cb()
        })
      })
    },
    function (err) {
      if (err) {
        inspect(err, 'error saving files to database')
        res.send(500, err)
        return
      }
      res.send(200, 'files saved correctly')
    })
}

上記の例に必要な依存関係をインストールするには、実行します npm install -S eyespect async

于 2013-05-02T16:28:11.890 に答える