async.waterfall не работает синхронно

#javascript #node.js #asynchronous #waterfall

#javascript #node.js #асинхронный #водопад

Вопрос:

Я пытаюсь написать заголовок хэш-токена MD5 с использованием криптографии, а затем вернуть его обратно в качестве ответа. По какой-то причине он фактически не работает синхронно. Я знаю, что JS — это асинхронный язык, и это действительно единственная часть, с которой я сейчас борюсь. Любая помощь будет оценена.

Это то, что у меня есть до сих пор:

 const crypto = require('crypto');
const bodyParser = require('body-parser');
const formidable = require('formidable');
const async = require('async')

app.post('/pushurl/auth', (req, res) =>
    var data = req.body.form1data1   '§'   req.body.form1data2 
        

    async.waterfall([
            function(callback) {
                var token = crypto.createHash('md5').update(data).digest("hex");
                callback(null, token);
            },
            function(token, callback) {
                res.writeHead(301,
                    {Location: '/dashboard?token='   token}
                );
                callback(null)
            },
            function(callback) {
                res.end();
                callback(null)
            }
        ]);
        
    }
});
  

Вывод:

 Uncaught Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
<node_internals>/internal/errors.js:256
    No debugger available, can not send 'variables'
Process exited with code 1
  

Комментарии:

1. async.waterfall() это просто усложняет ситуацию. Здесь вообще не нужно.

Ответ №1:

JavaScript — это асинхронный язык, да, но он также может очень хорошо выполнять синхронные задачи. В вашем случае вам не нужно выполнять какие-либо асинхронные ожидания, если вы имеете дело с обещаниями.

Если вы напишете свой код, как в примере ниже, он будет просто выполняться сверху вниз.

Но ошибка (вероятно) произошла из-за того, что вы забыли добавить открывающую фигурную скобку к вашему app.post обратному вызову, что приводит к data немедленному возврату переменной из-за подразумеваемого оператора return () => (подразумеваемого), () => {} (явного).

 const crypto = require('crypto');
const bodyParser = require('body-parser');
const formidable = require('formidable');

app.post('/pushurl/auth', (req, res) => {

  const data = req.body.form1data1   '§'   req.body.form1data2;
  const token = crypto.createHash('md5').update(data).digest("hex");
  res.writeHead(301, {
    Location: '/dashboard?token='   token
  });
  res.end();
        
});
  

Комментарии:

1. Даже удалив все материалы async.waterfall, я все равно получаю точно такой же результат.

2. Тогда ошибка может быть вызвана другой частью вашего кода. Найдите другую конечную точку, где вы возвращаете ответ несколько раз в одной конечной точке.

3. даже res.redirect, похоже, вызывает то же самое. Я еще посмотрю, в чем проблема.

4. Ошибка вызвана тем, что где-то вы отправляете ответ, а затем пытаетесь изменить заголовки. Так что ищите это.

5. Оказывается, что другая часть моего js, которая шла после этого, выполнялась для записи другого перенаправления после его отправки. В любом случае спасибо за помощь. Вы избавили меня от большой головной боли!