Для ошибки Can not connect to the SQL Server. The original error is: Login failed for user 'username'.
необходимо выполнить требования к порту на стороне сервера MSSQL.
В брандмауэре Windows необходимо настроить другие порты за пределами стандартного порта 1433.
Вызовите функции resolve
и reject
, когда запланированные операции были фактически завершены.
Помните, что при работе с асинхронными операциями код, который вы пишете, выполняется не по порядку, то есть не в том порядке, в котором он записан в файле.
Рассмотрим следующие примеры:
Не будет работать
return new Promise(function (resolve, reject) {
let result
fs.someAsyncOperation(function (data) {
result = data
})
resolve(result) // the promise will resolve immediately with undefined value
}
Будет работать
return new Promise(function (resolve, reject) {
fs.someAsyncOperation(function (result) {
resolve(result) // the promise will resolve after async operation is completed
})
}
Ваш код следует переделать, чтобы дождаться результатов асинхронной операции перед вызовом функции resolve
.
В вашей функции обещания sendMessage разрешение должно быть внутри обратного вызова функции sendMail, поскольку оно асинхронное.
transporter.sendMail(mailOptions, function(error,info){
resolve();
});
Асинхронная работа иногда становится очень сложной, особенно если вы привыкли к синхронным процессам. Когда я начал заниматься программным обеспечением, это привело меня в замешательство.
Вы обещаете, что функции хороши. Проблема заключалась в том, что вы решали функцию отправки до того, как она действительно выполнила свою работу.
Итак, ниже приведена более простая версия вашего кода. Делая то же самое, что вы сделали
// function that returns a message
// duration: 1s
function getMessage() {
return new Promise(resolve => {
setTimeout(() => resolve('important message'), 1000)
});
}
// function that send a message using sendEmail function
// duration should be based on sendEmail
// notice that the resolve is called inside the callback
function sendMessage(message) {
return new Promise((resolve, reject) => {
sendEmail(message, (err, result) => {
// do some stuff if email was sent
})
resolve();
});
}
// function try to send an email asynchronously using a callback
// duration: 0.5s
function sendEmail(message, callback) {
setTimeout(() => {
console.log('email sent!')
callback(null, 'message sent');
}, 500)
}
getMessage().then(result => {
return sendMessage(result);
}).then(() => {
console.log('should be done after email')
})
С помощью приведенного выше кода ваш терминал должен показать
should be done after email
email sent!
Но с некоторыми изменениями в функции sendMessage
function sendMessage(message) {
return new Promise((resolve, reject) => {
sendEmail(message, (err, result) => {
resolve(result);
})
});
}
терминал теперь должен показывать
email sent!
should be done after email