NodeJS exec mkdir 不工作

NodeJS exec mkdir not working

以下代码在 c:/api/iaas 中创建 Vagrantfile 而不是使用 mkdir 创建新文件然后添加 Vagrantfile 到那个文件夹。

mkdir 部分应该创建文件夹,但它并没有创建。如何修复它以便创建文件夹然后将 Vagrantfile 添加到其中?

Desired: c:/api/iaas/ubuntu/Vagrantfile

What happens now: c:/api/iaas/Vagrantfile

代码:

exec(function (err, boxes) {
  if (err) return next(err);

  exec('mkdir ' + box.boxos, {
      cwd: 'c:/api/iaas/'
  }, function (error, stdout, stderr) {
      // work with result
  });

  exec('vagrant init ' + box.boxos + '/' + box.boxversion, {
      cwd: 'c:/api/iaas/' + box.boxos + '/'
  }, function (error, stdout, stderr) {
      // work with result
  });

  res.redirect('/profile/');
});

由于这两个步骤相互依赖,因此需要按顺序执行这两个步骤。 使用 fs.mkdirSync 创建目录,然后进行依赖逻辑。

https://nodejs.org/api/fs.html

另一种选择是在 fs.mkdir

的回调中处理后续的依赖逻辑
var user_id = req.user.id;

var fs = require('fs');

fs.mkdir('c:/api/iaas/' + box.boxos, function (err) {
    if(err) {
        console.log('error in mkdir: ' + err);
    } else {
        Box.
        find({
            user_id: user_id
        }).
        sort('-updated_at').
        exec(function (err, boxes) {
            if (err) return next(err);

            var exec = require('child_process').exec;
            exec('vagrant init ' + box.boxos + '/' + box.boxversion, {
                cwd: 'c:/api/iaas/' + box.boxos
            }, function (error, stdout, stderr) {
                // work with result
            });

            res.redirect('/profile/');
        });
    }
});

你真的应该看看关于异步编程的书。

简单的解决方案是 nmp install mkdirp

app.get('/addbox/:id', isLoggedIn, function (req, res) {
        Box.findById(req.params.id, function (err, box) {
            console.log('addbox clicked');

            var user_id = req.user.id;

            //            var mkdirp = require('mkdirp');
            //            mkdirp('c:/api/iaas/' + box.boxos, function (err) {});

            Box.
            find({
                user_id: user_id
            }).
            sort('-updated_at').
            exec(function (err, boxes) {
                if (err) return next(err);

                var box_path = 'c:/api/iaas/' + req.user.local.username + '/' + box.boxos + '/' + box.boxversion + '/' + box.id + '/'

                new Instance({
                    user_id: req.user.id,
                    box_id: box.id,
                    box_path: box_path,
//                    ssh: req.body.ssh,
                    ssh: "ssh-",
                    username: req.user.local.username,
                    password: req.user.local.password
                }).save(function (err, instance, count) {
                    if (err) return next(err);



                    mkdirp(box_path, function (err) {
                        var exec = require('child_process').exec;
                        exec('vagrant init ' + box.boxos + '/' + box.boxversion, {
                            cwd: box_path
                        }, function (error, stdout, stderr) {
                            // work with result
                        });

                        res.redirect('/profile/');
                    });


                });
            });
        });
    });