繁体   English   中英

如何在节点 js 中同步进行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM