У меня есть служба, которая анализирует веб-сайты, сжимает их источники, такие как CSS-документы, изображения и т. Д. У меня есть 2 функции, одна из них - метод Socket.IO socket.on()
с функцией асинхронного обратного вызова.Другая основная функция для обслуживания.
socket.on('run', async options => {
debug(`${options.target} Adresine Bir Kullanıcı İstek Yaptı!`);
let user = null;
console.log(options);
if(options.token) {
user = await User.findById(jwt.verify(options.token, config.get('jwtPrivateKey'))._id);
options.userId = user._id.toString();
} else if(options.visitor) {
user = await Visitor.findById(options.visitor._id);
if(user.report) {
return socket.emit('error', new Error('You have exceeded your report limit'));
} else {
options.userId = user._id.toString();
}
}
if(options.userId) {
let userType = await UserType.find({ name: user.type });
if(userType.length > 0 && ((user.type == 'Visitor' && user.report == undefined) || (user.reports.length < userType[0].rights.reportsLimit.limit || userType[0].rights.reportsLimit.unlimited))) {
options.rights = userType[0].rights;
let { error, data } = await wrapper(runService(options.target, options, socket));
if(error) {
console.log('Here', error);
return socket.emit('error', error);
}
.
.
.
}
.
.
.
}
});
В приведенной выше функции
let { error, data } = await wrapper(runService(options.target, options, socket));
if(error) {
console.log('Here', error);
return socket.emit('error', error);
}
Эта часть важна, потому что я вызываю свою основную функцию асинхронного обслуживания runService
с моей асинхронной функцией.функция-обертка с именем wrapper
.Это функция-обертка;
const wrapper = promise => (
promise
.then(data => ({ data, error: null }))
.catch(error => ({ error, data: null }))
);
В моей основной асинхронной сервисной функции я только выдаю ошибку;
async function runService(target, options, socket) {
throw new Error('any error');
}
Но ожидаемый результат сильно отличается от фактического результата.Вот вывод этого кода:
Here Error: any error
at startService (C:\Projeler\OpDetect\Background-Service\lib\app.js:404:11)
at Socket.socket.on (C:\Projeler\OpDetect\Background-Service\app.js:73:57)
at process._tickCallback (internal/process/next_tick.js:68:7)
(node:16600) UnhandledPromiseRejectionWarning: Error: any error
at startService (C:\Projeler\OpDetect\Background-Service\lib\app.js:404:11)
at Socket.socket.on (C:\Projeler\OpDetect\Background-Service\app.js:73:57)
at process._tickCallback (internal/process/next_tick.js:68:7)
(node:16600) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:16600) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate
процесс Node.js с ненулевым кодом выхода.
Мои ожидания по поводу вывода выглядят так:
Here Error: any error
at startService (C:\Projeler\OpDetect\Background-Service\lib\app.js:404:11)
at Socket.socket.on (C:\Projeler\OpDetect\Background-Service\app.js:73:57)
at process._tickCallback (internal/process/next_tick.js:68:7)
Поскольку я уже обработал отклонение обещания своей функцией-оберткой и перехватил отклонение, почему еще 2 UnhandledPromiseRejectionWarning
ошибки при отклонении?
Кроме того, строка,
return socket.emit('error', error);
не звонит без причины.Это должно было быть вызвано, когда if
утверждение правдиво.Почему не вызывается эта socket.emit
функция?