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/');
});
});
});
});
});
以下代码在 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/');
});
});
});
});
});