node.js - 如何在节点 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(...) { ... }
) 包装在这样的 Promise 中。
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);
})
推荐阅读
- python - Python 无法正确读取来自少数电子邮件域(例如 hotmail)的响应
- javascript - React Ref 对象在第二次调用后自行重置
- vb.net - 迭代字典,同时修改它的值(但不是它的键)
- ubuntu - Ubuntu 20.04 Dockerfile 得到 E: Unable to locate package yum 错误
- php - 可以从枚举的 HTML INPUT 值创建数字索引的 php 数组,而无需一一分配吗?
- python - 如何从用 Python 调用的外部程序获取输出?
- c# - 为什么限制我的游戏对象移动到相机框架会阻止移动?
- javascript - 努力在 Apps 脚本中修补 JSON 响应
- python-3.x - 从python中的xml文件中提取数据
- javascript - 创建每行的字符串数组