如何在节点js中分配局部变量

How can I assign local variables in node js

我用 nodejs 制作了一个邮件程序,但我遇到了一些问题。

          var smtpSender;
      var smtpMailAdress;
      ipcMain.on("mail:send", (err, data) => {

      db.query("SELECT * FROM mail_accounts", (error, results, fields) => {
        var string=JSON.stringify(results);
        var json =  JSON.parse(string);
        smtpSender = nodemailer.createTransport({
              host: json[0].host,
              port: json[0].port,
              auth: {
                user: json[0].username,
                pass: json[0].password  
              }
          });
          smtpMailAdress = json[0].username
        });
        console.log(smtpSender);
        console.log(smtpMailAdress);
  });

smtpSender 和 smtpMailAdress 未更新,仍未定义。我怎么算 it.Thanks.

db.query是异步的,即当它被触发时,运行时会一直向前,而它的回调函数会在数据库发回结果时执行。

以下是运行时执行器发生的情况:

  1. 触发器db.query
  2. 日志 smtpSender -> 未定义
  3. 日志 smtpMailAdress -> 未定义
  4. 执行db.query的回调,修改smtpSendersmtpMailAdress
  5. 的内容

如果您在回调中移动 console.logs,它将起作用。但是,这可能不是您想要的,因为您可能不想将整个代码移动到回调中。

处理此问题的一个简单方法是承诺您对数据库的调用并等待其完成:

var smtpSender;
var smtpMailAdress;
ipcMain.on('mail:send', async (err, data) => {
  await new Promise((resolve) => {
    db.query('SELECT * FROM mail_accounts', (error, results, fields) => {
      var string = JSON.stringify(results);
      var json = JSON.parse(string);
      smtpSender = nodemailer.createTransport({
        host: json[0].host,
        port: json[0].port,
        auth: {
          user: json[0].username,
          pass: json[0].password,
        },
      });
      smtpMailAdress = json[0].username;
      resolve();
    });
  });
  console.log(smtpSender);
  console.log(smtpMailAdress);
});

如果您只想将变量输出到控制台,则此解决方案更好:

      var smtpSender;
  var smtpMailAdress;
  ipcMain.on("mail:send", (err, data) => {

  db.query("SELECT * FROM mail_accounts", (error, results, fields) => {
    var string=JSON.stringify(results);
    var json =  JSON.parse(string);
    smtpSender = nodemailer.createTransport({
          host: json[0].host,
          port: json[0].port,
          auth: {
            user: json[0].username,
            pass: json[0].password  
          }
      });
      smtpMailAdress = json[0].username
      console.log(smtpSender);
      console.log(smtpMailAdress);
    });

});

通过这样做,您不会破坏 node.js 提供的异步执行,对性能和服务器运行状况更好。