[英]How can I do it synchronously in node js
我是 Node.js 的新手,我希望下面的代码同步运行。
我想将数据库移动到另一个地方,但我需要等到前面的代码完成。
var exec = require('child_process').exec;
var sql = require('./connectDB');
var regedit = require('regedit');
var fs = require('fs');
var fse = require('fs-extra');
coll = "AT"
if (coll === "AT") {
coll = "Latin1_General_CI_AS"
} else if (coll === "BG") {
coll = "Cyrillic_General_CI_AS"
} else if (coll === "CZ") {
coll = "Czech_CI_AS"
} else if (coll === "HU") {
coll = "Hungarian_CI_AS"
}
console.log("Change of collation");
exec(
`"c:/Program Files (x86)/Microsoft SQL Server/120/Setup Bootstrap/SQLServer2014/setup" /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=hruza /SAPWD=ES_uni2004 /SQLCOLLATION="${coll}"`,
function (err, stdout,stderr) {
if (err) {
console.error(`Setting of SQL collation error: ${err}`);
console.log(`${stdout}`);
}
exec(
`net start MSSQLSERVER`,
function (err, stdout, stderr) {
}
)
exec(
`net start SQLBrowser`,
function (err, stdout, stderr) {
}
)
exec(
`net start SQLWriter`,
function (err, stdout, stderr) {
}
)
sql.connectDB(
`master`,
`ALTER DATABASE master MODIFY FILE (NAME = master, FILENAME = 'c:/DB/DATABASE/Data/master.mdf')`,
`ALTER DATABASE master MODIFY FILE (NAME = mastlog, FILENAME = 'c:/DB/DATABASE/Data/mastlog.ldf')`,
function (err, out) {
if (err) {
console.error(`Setting of SQL collation error: ${err}`);
console.log("Master DB location changed");
}
console.log("Writing registry SQL");
var registryKey = 'HKLM\\SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SQL Server\\MSSQL12.MSSQLSERVER\\MSSQLServer\\Parameters';
const registryValue = {[registryKey]: {
'SQLArg0': {
value: `-d$c:\\DB\\Database\\Data\\master.mdf`,
type: 'REG_SZ'
},
'SQLArg1': {
value: '-eC:\\Program Files (x86)\\Microsoft SQL Server\\MSSQL12.MSSQLSERVER\\MSSQL\\Log\\ERRORLOG',
type: 'REG_SZ'
},
'SQLArg2': {
value: `-l$c:\\DB\\Database\\Data\\mastlog.ldf`,
type: 'REG_SZ'
}
}
};
regedit.putValue(registryValue, function(err, result) {
if (err) console.log(err)
console.log(result);
});
console.log("Stop service SQL");
exec(
`net stop MSSQLSERVER`,
function (err, stdout, stderr) {
}
)
// moving db to another place but I need to wait to previous code finishs
fse.move(
'c:/Program Files (x86)/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/master.mdf',
'c:/DB/Data/master.mdf',
{ overwrite: true }
)
fse.move(
'c:/Program Files (x86)/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/mastlog.ldf',
'c:/DB/Database/Data/mastlog.ldf',
{ overwrite: true }
)
});
});
最简单的技巧是查看库是否有promise()
方法,如果幸运的话,有时他们会这样做。
但是,在不太可能发生的情况下,您始终可以将回调函数( function(...) { ... }
)包装在这样的承诺中。
let promiseResult = await new Promise(function(resolve, reject) {
sql.connectDB(`master`,`ALTER DATABASE master MODIFY FILE (NAME = master, FILENAME = 'c:/DB/DATABASE/Data/master.mdf')`,`ALTER DATABASE master MODIFY FILE (NAME = mastlog, FILENAME = 'c:/DB/DATABASE/Data/mastlog.ldf')`, function (err,out) {
if (err) return reject(err);
return resolve(out);
})
您还必须将此代码包装在另一个async
函数中
async function yourFunName() {
let promiseResult = await new Promise(function(resolve, reject) {
sql.connectDB(`master`,`ALTER DATABASE master MODIFY FILE (NAME = master, FILENAME = 'c:/DB/DATABASE/Data/master.mdf')`,`ALTER DATABASE master MODIFY FILE (NAME = mastlog, FILENAME = 'c:/DB/DATABASE/Data/mastlog.ldf')`, function (err,out) {
if (err) return reject(err);
return resolve(out);
})
}
yourFunName().then(data => {
console.log(data);
}).catch(err => {
console.error(err);
})
回调函数不会等待里面的代码完成。 同步代码的最简单方法是将以下文件移动到 sql.connectDB 的回调函数中。
fse.move('c:/Program Files (x86)/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/master.mdf', 'c:/DB/Data/master.mdf', { overwrite: true })
fse.move('c:/Program Files (x86)/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/mastlog.ldf', 'c:/DB/Database/Data/mastlog.ldf', { overwrite: true })
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.