如何在节点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
是异步的,即当它被触发时,运行时会一直向前,而它的回调函数会在数据库发回结果时执行。
以下是运行时执行器发生的情况:
- 触发器
db.query
- 日志
smtpSender
-> 未定义
- 日志
smtpMailAdress
-> 未定义
- 执行
db.query
的回调,修改smtpSender
和smtpMailAdress
的内容
如果您在回调中移动 console.log
s,它将起作用。但是,这可能不是您想要的,因为您可能不想将整个代码移动到回调中。
处理此问题的一个简单方法是承诺您对数据库的调用并等待其完成:
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 提供的异步执行,对性能和服务器运行状况更好。
我用 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
是异步的,即当它被触发时,运行时会一直向前,而它的回调函数会在数据库发回结果时执行。
以下是运行时执行器发生的情况:
- 触发器
db.query
- 日志
smtpSender
-> 未定义 - 日志
smtpMailAdress
-> 未定义 - 执行
db.query
的回调,修改smtpSender
和smtpMailAdress
的内容
如果您在回调中移动 console.log
s,它将起作用。但是,这可能不是您想要的,因为您可能不想将整个代码移动到回调中。
处理此问题的一个简单方法是承诺您对数据库的调用并等待其完成:
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 提供的异步执行,对性能和服务器运行状况更好。